题意:本题是83题(Remove Duplicates from Sorted List)的拓展,这次重复的元素一个都不保留。
例子:
给定链表 1->2->3->3->4->4->5, 返回链表 1->2->5.
给定链表 1->1->1->2->3, 返回链表 2->3.
思路:道理还是和83题一样,只是现在要把前驱指针指向上一个不重复的元素中,如果找到不重复元素,则把前驱指针指向该元素,否则删除此元素。算法只需要一遍扫描,时间复杂度是O(n),空间只需要几个辅助指针,是O(1)。代码如下
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null) return null;
ListNode fakeHead = new ListNode(0);
fakeHead.next = head;
ListNode left = fakeHead;
ListNode right = head;
while(right != null){
while(right.next != null && right.val == right.next.val){
right = right.next;
}
if(left.next == right){
left = right;
}else{
left.next = right.next;
}
right = right.next;
}
return fakeHead.next;
}
}