1. 程式人生 > 其它 >82.刪除排序連結串列中的重複元素 II

82.刪除排序連結串列中的重複元素 II

技術標籤:# 連結串列專題javaleetcode連結串列

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 } }

在這裡插入圖片描述