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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值