zoukankan      html  css  js  c++  java
  • 剑指Offer:删除链表的节点【18】

    剑指Offer:删除链表的节点【18】

    题目描述

      在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

    题目分析

      

      如上图所示,我们的定义了三个指针,其中第二、三个指针用于找到重复元素的第一个位置和最后一个位置的下一个位置,然后第一个指针的下一个指向三个指针,这样就跳过了重复元素。

    但是编码发现后,还有两种情况欠考虑。

      

      这种情况,刚开始,就是重复,那第一个指针直接指向最后一个指针,所以返回的时候不能直接返回pHead了,因为那样子的话,就相当于没有删除。当然还有一种情况就是重复元素直接到最后一个元素

      

      这时候我们需要处理一个边界问题,如果第三个指针的下一个为空,说明他已经是最后一个元素了,它与第二个指针之前的元素都是重复元素,都应该删除,所以我们直接让第一个指针指向空即可!

    Java题解

    package linklist;
    
    import java.util.Scanner;
    
    public class DeleteDuplication {
        public static void main(String[] args) {
            ListNode a1 = new ListNode(1);
            ListNode a2 = new ListNode(1);
            ListNode a3 = new ListNode(1);
            ListNode a4 = new ListNode(1);
            ListNode a5 = new ListNode(1);
            ListNode a6 = new ListNode(1);
            ListNode a7 = new ListNode(1);
            a1.next=a2;
            a2.next=a3;
            a3.next=a4;
            a4.next=a5;
            a5.next=a6;
            a6.next=a7;
            deleteDuplication(a1);
        }
    
    
        public static ListNode deleteDuplication(ListNode pHead)
        {
            if(pHead==null)
                return null;
            ListNode pA = new ListNode(0);
            pA.next = pHead;
            ListNode pB = pHead;
            ListNode pC =pHead.next;
    
            ListNode start = pA;
    
            while (pC!=null)
            {
                if(pC.val!=pB.val)
                {
                    pA=pA.next;
                    pB=pB.next;
                    pC=pC.next;
                }else {
                    while (pC!=null&&pC.val == pB.val) {
                        pC = pC.next; //直到找到相等为止
                    }
                    pA.next = pC;
                    pB =pC;
                    if(pC==null)
                        break;
                    pC=pC.next;
                }
            }
            start=start.next;
            while (start!=null)
            {
                System.out.println(start.val);
                start=start.next;
            }
            return null;
        }
    }
    

       

  • 相关阅读:
    我向老师问声好
    创业的27个真相:破釜沉舟时,要先学会潜水
    印象品牌:成功的标志
    稻盛和夫:打造两个世界500强的强者思维
    假如我们不曾相逢
    让我的诗句带走你的空虚
    昨日的誓言
    假如我有一百万
    我把我的青春献给你
    代腾飞(一读者为IT诗人代腾飞名字作诗)
  • 原文地址:https://www.cnblogs.com/MrSaver/p/9280166.html
Copyright © 2011-2022 走看看