題意:本題是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;
}
}