標籤:int solution 節點 efi ted move next IV amp
Given a sorted linked list, delete all duplicates such that each element appear only once.
Example 1:
Input: 1->1->2Output: 1->2
Example 2:
Input: 1->1->2->3->3Output: 1->2->3
很簡單的鏈表問題,可以寫成遞迴和迭代兩種形式。具體思路:
第一步,尋找第一個節點值和當前表頭所指的節點值不同的節點;
第二步,讓當前表前端節點的next指向找到的節點;
第三部,遞迴調用前兩步,或迭代調用前兩步。
詳細代碼註解見下。
遞迴解法(Java)
/** * 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 || head.next == null) return head; //特殊情況處理,即空鏈表和單節點鏈表直接返回 ListNode cur = head.next; //設定指標指向表頭後的第一個節點 while (cur != null && cur.val == head.val) cur = cur.next; //第一步,尋找第一個節點值和當前表前端節點所指節點值不同的節點 head.next = deleteDuplicates(cur); //找到後,進行第二步,即讓當前表前端節點的next指向剛才找到的節點。這裡用了遞迴調用,上面找到的不重複節點是cur,那麼這個遞迴返回的恰恰是cur,且同時執行以cur為節點頭的去重工作 return head; //返回頭結點 }}
迭代解法(Java)
/** * 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 || head.next == null) return head; //特殊情況處理,同迭代解法 ListNode pre = head, cur = head.next; //定義兩個指標分別指向當前前端節點和其下一個節點 while (cur != null) { if (cur.val == pre.val) cur = cur.next; //第一步,尋找第一個非重複節點 else { pre.next = cur; //找到後進行第二步,即讓當前節點pre的next指向找到的節點cur pre = cur; //之後重複之前的過程 cur = pre.next; } } pre.next = cur; //迭代到最後因為cur為null的時候就跳出迴圈了,沒有執行最後的去重,所以加一句讓鏈表末尾沒有重複節點 return head; }}
(Java) LeetCode 83. Remove Duplicates from Sorted List —— 刪除排序鏈表中的重複元素