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

浙公网安备 33010602011771号