刪除一個有序鏈表的重複元素

如題,給定一個有序鏈表,刪除掉其中重複結點,使其每個元素只有一個。
測試用例: 1->1->2, 返回1->2.
1->1->1->1,返回 1.
1->1->2->3->3, 返回1->2->3.
1->2->3->4->4->4->4,返回1->2->3->4
在這裏給出非遞歸和遞歸的代碼:
非遞歸代碼:

public ListNode deleteDuplicates(ListNode head) {
        ListNode temp = head;
        while(temp != null){
            if(temp.next == null) return head;
            if(temp.val == temp.next.val){
                temp.next = temp.next.next;
            }
            else temp = temp.next;
        }
        return head;
    }
遞歸代碼:
public ListNode deleteDuplicates(ListNode head) {
    if(head == null || head.next == null)return head;
    head.next = deleteDuplicates(head.next);
    return head.val == head.next.val ? head.next : head;
}

在做這道題的時候我用非遞歸算法時,裏面第八行裏沒寫else,這時問題來了,到上面給出的第三個測試案例時,就出現錯誤的答案了,本來答案應該是 1 的,但是我的答案是 1->1 ,很明顯是我錯了。我仔細想了一下,要是沒有else的話,最後三個是同一個元素的鏈表中到最後一個元素時就不會刪除,就會出現錯誤。爲什麼會這樣呢?這跟我考慮不全面有關,我一開始慣性思維,直接想到每一個比較不管相不相同都直接跳到下個結點,是我沒有考慮到首尾的情況。要是我在我原來的思路基礎上改的話要在循環外面再加一個判斷語句,這樣會有點麻煩。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章