(Java) LeetCode 83. Remove Duplicates from Sorted List —— 刪除排序鏈表中的重復元素
阿新 • • 發佈:2018-07-02
def TP htm val brush etc 過程 表頭 遞歸解法
Given a sorted linked list, delete all duplicates such that each element appear only once.
Example 1:
Input: 1->1->2 Output: 1->2
Example 2:
Input: 1->1->2->3->3 Output: 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) returnhead; //特殊情況處理,即空鏈表和單節點鏈表直接返回 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 —— 刪除排序鏈表中的重復元素