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返回了一个无重复的节点,所以要让当前节点指向它。
    */
  • 相关阅读:
    Vmware14中设置Centos7静态密码
    字符串和集合截取
    通过FTP连上centos7
    centos7 离线安装mysql-5.7.21
    基于jackson注释@JsonFormat 格式化时间少8小时
    Kotlin基础学习笔记 (三)
    Android 常用开源框架源码解析 系列 (零)引言
    Kotlin基础学习笔记 (一)
    Android 常用开源框架源码解析 系列 (十一)picasso 图片框架
    Android 常用开源框架源码解析 系列 (十)Rxjava 异步框架
  • 原文地址:https://www.cnblogs.com/Roni-i/p/10370366.html
Copyright © 2011-2022 走看看