1. 程式人生 > >劍指Offer:刪除鏈表的節點【18】

劍指Offer:刪除鏈表的節點【18】

技術分享 保留 元素 ner sys klist == 節點 lin

劍指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;
    }
}

  

劍指Offer:刪除鏈表的節點【18】