删除一个有序链表的重复元素

如题,给定一个有序链表,删除掉其中重复结点,使其每个元素只有一个。
测试用例: 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的话,最后三个是同一个元素的链表中到最后一个元素时就不会删除,就会出现错误。为什么会这样呢?这跟我考虑不全面有关,我一开始惯性思维,直接想到每一个比较不管相不相同都直接跳到下个结点,是我没有考虑到首尾的情况。要是我在我原来的思路基础上改的话要在循环外面再加一个判断语句,这样会有点麻烦。

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