LeetCode筆記:83. Remove Duplicates from Sorted List

問題:

Given a sorted linked list, delete all duplicates such that each element appear only once.
For example,
Given 1->1->2, return 1->2.
Given 1->1->2->3->3, return 1->2->3.

大意:

給出一個排好序的鏈表,刪除所有的重復的數(shù)字,讓每個元素只出現(xiàn)一次。
比如:
給出 1->1->2, 返回1->2.
給出1->1->2->3->3, 返回1->2->3.

思路:

既然鏈表本身已經(jīng)排好序了,那么只用比較當前位置的值和next的值是否一樣,一樣就把next指向下一個再繼續(xù)判斷就好了,思路還是比較簡單,但是有幾個容易忽略的點需要注意。

  1. 首先是首節(jié)點為空的情況要考慮;
  2. 其次是只有當當前數(shù)字和下一個數(shù)字不一樣時才把操作的節(jié)點換成下一個節(jié)點去繼續(xù)向后操作,因為有可能有多個重復的數(shù)字串在一起,不能刪除一個節(jié)點后就直接往后移進行判斷,要判斷刪了一個以后下一個是否還是一樣;
  3. 如果鏈表的最后幾個數(shù)字都是重復的,我們在檢測到重復的數(shù)字時會刪除它然后將當前節(jié)點的next指向next的next,但是這里要注意判斷next是否還有next,如果沒有卻進行操作,那就會出錯了。

在自己檢測時可以試試代碼對下面幾個測試用例是否能通過:

  • []
  • [1,1]
  • [1,1,2]
  • [1,1,1]

代碼(Java):

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null) return head;
        ListNode p = head;
        while (p.next != null) {
            ListNode q = p.next;
            if (q.val == p.val) {
                if (q.next != null) {
                    p.next = q.next;
                }
                else p.next = null;
            } 
            else p = p.next;
        }
        return head;
    }
}

代碼(C++)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if (head == nullptr || head->next == nullptr) return head;

        
        while(true) {
            if (head->next == nullptr) break;
            if (head->val == head->next->val) {
                head->next = head->next->next;
            } else {
                break;
            }
        }
        deleteDuplicates(head->next);
        return head;
    }
};

合集:https://github.com/Cloudox/LeetCode-Record


查看作者首頁

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容