82.刪除排序連結串列中的重複元素 II
阿新 • • 發佈:2021-01-30
82. 刪除排序連結串列中的重複元素 II
給定一個排序連結串列,刪除所有含有重複數字的節點,只保留原始連結串列中 沒有重複出現 的數字。
示例 1:
輸入: 1->2->3->3->4->4->5
輸出: 1->2->5
示例 2:
輸入: 1->1->1->2->3
輸出: 2->3
思路:
我們要把當前為某個值的前一結點preNode記錄下來,和後面值比當前結點的值大的結點相連,詳細思路寫在了程式碼對應的位置更容易看懂。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
/*由於頭結點也可能是重複的會被刪除,所以建立虛擬結點dummy,使得操作統一
我們要把當前為某個值的前一結點preNode記錄下來,和後面值比當前結點的值大的結點相連*/
if(head == null || head.next == null) return head;
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode preNode = dummy;
//由於要用到p.next.val所以要判斷p.next!=null
while(preNode != null && preNode.next != null){
ListNode curNode = preNode.next;
int count = 0;
//讓curNode指向第一個值不為preNode.next.val的結點
while(curNode != null && preNode.next.val == curNode. val){
curNode = curNode.next;
count++;
}
//如果curNode只跨越了一個結點,說明curNode跨越的該段不重複,
//那麼就不用刪除,移動preNode即可
if(count == 1) preNode = preNode.next;
else{//curNode跨越了多個結點,目前指向了第一個值不為preNode.next.val的結點
//故直接讓preNode.next = curNode,相當於刪除了curNode跨越的重複的那段
preNode.next = curNode;
}
}
return dummy.next;//返回dummy.next
}
}