Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,
Given 1->2->3->3->4->4->5
, return 1->2->5
.
Given 1->1->1->2->3
, return 2->3
.
这里的删除跟前面的删除的区别是,有重复的就全都要删掉。
在这里,我们需要一个指针是指向重复开始前的,另一个指针指向最后一个重复元素的。
注意>3->3->4->4
这种情况的。
我的处理办法是:碰到最后一个重复元素尾部后,再看看下面的还是不是重复的。
运行时间:
代码:
public ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode fakeNode = new ListNode(-1);
fakeNode.next = head;
ListNode begin = fakeNode, pre = head, cur = head.next;
while (cur != null) {
if (cur.val == pre.val) {
while (cur != null && cur.val == pre.val) {
cur = cur.next;
pre = pre.next;
}
if (cur == null || cur.next == null) {
begin.next = cur;
return fakeNode.next;
} else if (cur.next.val == cur.val) {// checking if behind is dup
pre = cur;
cur = cur.next;
} else {
begin.next = cur;
begin = begin.next;
pre = cur.next;
cur = cur.next.next;
}
} else {
begin = pre;
pre = pre.next;
cur = cur.next;
}
}
return fakeNode.next;
我的代码感觉写的很丑。
之后又看到一个更简洁的代码:
public ListNode deleteDuplicates2(ListNode head) {
// slow - track the node before the dup nodes,
// fast - to find the last node of dups.
ListNode fakeNode = new ListNode(-1), fast = head, slow = fakeNode;
slow.next = head;
while (fast != null) {
while (fast.next != null && fast.val == fast.next.val) {
fast = fast.next;
}
if (slow.next != fast) {//duplicates detected.
slow.next = fast.next; // remove dup
fast = slow.next; // update fast
} else {
slow = slow.next;
fast = fast.next;
}
}
return fakeNode.next;
}
参考资料:
https://leetcode.com/discuss/58516/java-simple-and-clean-code-with-comment