1. 程式人生 > 實用技巧 >劍指56.刪除連結串列中重複的結點

劍指56.刪除連結串列中重複的結點

題目描述

在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->5

思路

思路1:雙指標非遞迴法。本題目的關鍵是要考慮到多種測試用例,例如重複的結點位於連結串列頭部、中間、尾部。

思路2:遞迴法。

☆☆解法1.1

public class Solution {
    public ListNode deleteDuplication(ListNode pHead) {
        if (pHead == null
) return null; ListNode pre = null; ListNode cur = pHead; while (cur != null){ if (cur.next != null && cur.val == cur.next.val){ while (cur.next != null && cur.val == cur.next.val){ cur = cur.next; } cur
= cur.next; if (pre == null){ pHead = cur; }else{ pre.next = cur; } }else{ pre = cur; cur = cur.next; } } return pHead; } }

☆☆解法1.2(使用虛擬頭節點)

public class Solution {
    public ListNode deleteDuplication(ListNode pHead) {
        if (pHead == null || pHead.next == null){
            return pHead;
        }
        ListNode head = new ListNode(-1);
        head.next = pHead;
        ListNode pre = head;
        ListNode cur = head.next;
        while (cur != null){
            if (cur.next != null && cur.val == cur.next.val){
                while (cur.next != null && cur.val == cur.next.val){
                    cur = cur.next;
                }
                cur = cur.next;
                pre.next = cur;
            }else{
                pre = pre.next;
                cur = cur.next;
            }
        }
        return head.next; // 虛擬頭節點的下一個才是真實頭節點
    }
}