删除排序链表中的重复节点
第一种是保留一个重复节点
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; }