• 剑指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;
        }
    }
    

       

  • 相关阅读:
    Angular相关UI框架的安装
    Visual Studio Code 编辑器常用插件
    Groovy特性
    Notification(Android)消息推送机制
    Sublime SVN插件使用方法 PS:翻出来的旧笔记,现在Sublime和svn用的都不多了
    Python基本语法练习笔记(一)
    首篇博文占坑
    apache2修改用户和组
    如何修改script.bin/script.fex
    perl的INC设置
  • 原文地址:https://www.cnblogs.com/MrSaver/p/9280166.html
Copyright © 2020-2023  润新知