zoukankan      html  css  js  c++  java
  • 剑指offer-删除链表中重复的结点

    在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
    链接:https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef
    来源:牛客网
    
    if (pHead==null || pHead.next==null){return pHead;}
    ListNode Head = new ListNode(0);
    Head.next = pHead;
    ListNode pre  = Head;
    ListNode last = Head.next;
    while (last!=null){
        if(last.next!=null && last.val == last.next.val){
            // 找到最后的一个相同节点
            while (last.next!=null && last.val == last.next.val){
                last = last.next;
            }
            pre.next = last.next;
            last = last.next;
        }else{
            pre = pre.next;
            last = last.next;
        }
    }
    return Head.next;
    链接:https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef
    来源:牛客网
    
    public static ListNode deleteDuplication(ListNode pHead) {
             
            ListNode first = new ListNode(-1);//设置一个trick
     
            first.next = pHead;
     
            ListNode p = pHead;
            ListNode last = first;
            while (p != null && p.next != null) {
                if (p.val == p.next.val) {
                    int val = p.val;
                    while (p!= null&&p.val == val)
                        p = p.next;
                    last.next = p;
                } else {
                    last = p;
                    p = p.next;
                }
            }
            return first.next;
        }
    链接:https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef
    来源:牛客网
    
    public class Solution {
        public ListNode deleteDuplication(ListNode pHead) {
            if (pHead == null || pHead.next == null) { // 只有0个或1个结点,则返回
                return pHead;
            }
            if (pHead.val == pHead.next.val) { // 当前结点是重复结点
                ListNode pNode = pHead.next;
                while (pNode != null && pNode.val == pHead.val) {
                    // 跳过值与当前结点相同的全部结点,找到第一个与当前结点不同的结点
                    pNode = pNode.next;
                }
                return deleteDuplication(pNode); // 从第一个与当前结点不同的结点开始递归
            } else { // 当前结点不是重复结点
                pHead.next = deleteDuplication(pHead.next); // 保留当前结点,从下一个结点开始递归
                return pHead;
            }
        }
    }

    /*
    作者:牛客396545268号
    链接:https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef
    来源:牛客网

    pHead.next = deleteDuplication(pHead.next); 实参pHead.next表示将当前节点与下一节点不同,
    所以要将下一节点放入递归程序去参加下一轮的比较,这样就将pHead保留了下来。
    返回值给pHead.next表示deleteDuplication返回了一个无重复的节点,所以要让当前节点指向它。
    */
  • 相关阅读:
    Android 去除最上面应用名称及图标
    Android 仿QQ消息界面
    多线程断点续传及下载
    android 断点下载---XUtils
    Android判断网路是否畅通加权限
    Android_按两次返回键退出程序和长按返回键退出程序
    Android JPush(极光推送)的使用教程
    使用VS2013自带的PreEmptive Dotfuscator and Analytis来混淆C#代码
    Entity Framework 6连接Oracle、Postgresql、SQLite、LocalDB数据库字符串详解
    Fluent Nhibernate 数据库配置
  • 原文地址:https://www.cnblogs.com/Roni-i/p/10370366.html
Copyright © 2011-2022 走看看