1. 程式人生 > >(Java) LeetCode 83. Remove Duplicates from Sorted List —— 刪除排序鏈表中的重復元素

(Java) LeetCode 83. Remove Duplicates from Sorted List —— 刪除排序鏈表中的重復元素

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) 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 —— 刪除排序鏈表中的重復元素