题目:
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,
Given1->2->3->3->4->4->5, return1->2->5.
Given1->1->1->2->3, return2->3.
题意:
给定一个已排序的链表,删除所有具有重复编号的节点,只留下与原始列表不同的编号。
解题思路:
一个辅助的头指针 dummy
一个 前驱指针 pre
一个指向当前的指针 cur
先判断值是否相等(cur.next != null && cur.next.val == pre.next.val),值相等,cur继续下移,直到值不相等为止,找到这个cur结点
然后判断结点是否相同(pre.next == cur),相同就继续遍历(pre = pre.next),不同就进行删除(pre.next = cur.next)
最后返回dummy.next就行
一般会改到链表头的题目就会需要一个辅助指针,是比较常见的技巧
举个例子:
-1 -> 1 -> 1 -> 1 -> 2 -> 3
此时,执行完内部的while循环后,cur指向第三个1,pre指向-1,那么我们判断pre->next (指向第一个1)和 cur,是不相同的,虽然结点值相同,都是1,但确是不同的结点,所以1全要跳过,那么-1后面要直接连上2。
但如果是下面这个链表:
-1 -> 1 ->2 -> 3
此时,执行完内部的while循环后,cur指向1,pre指向-1,那么我们判断pre->next 和 cur 是相同的,所以不能跳过1,那么直接让pre向后移动一个即可。
public ListNode deleteDuplicates(ListNode head) {
if(head == null) {
return null;
}
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode pre = dummy;
ListNode cur = head;
while(cur != null) {
while(cur.next != null && cur.next.val == pre.next.val) {
cur = cur.next;
}
if(pre.next == cur) {
pre = pre.next;
}
else {
pre.next = cur.next;
}
cur = cur.next;
}
return dummy.next;
}