删除排序链表中的重复节点

第一种是保留一个重复节点

https://leetcode.com/problems/remove-duplicates-from-sorted-list/

这种好理解,碰到重复的就把指针指向重复节点的下一个。

public ListNode deleteDuplicates(ListNode head) {
    if(head == null || head.next == null){
        return head;
    }
    
    ListNode tmp = head;
    while(tmp.next != null){
        if(tmp.val == tmp.next.val){
            tmp.next = tmp.next.next;
        }else {
            tmp = tmp.next;
        }
    }
    
    return head;
}

第二种删除所有重复的

https://leetcode.com/problems/remove-duplicates-from-sorted-list-ii/

这种由于传入链表的头结点存在被删除的可能,所以先定义了一个新的头结点。

定义两个指针,后一个(last)不断指向重复的节点,当遇到不重复节点的时候,也就是 $last != last.next$,需要把前一个(pre)指针的下一个指向后一个指针的下一个(因为要删除所有重复的节点,此时 last 指向当前重复的最后一个节点,所以要让 $pre.next = last.next$)

public ListNode deleteDuplicates(ListNode head) {
    if(head == null || head.next == null){
        return head;
    }
    
    ListNode fakeH = new ListNode(-1);
    fakeH.next = head;
    ListNode pre = fakeH;
    ListNode last = fakeH.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 fakeH.next;
}

  

原文地址:https://www.cnblogs.com/ainsliaea/p/11484655.html