删除链表中所有重复结点,重复结点不保留

9 篇文章 0 订阅

删除链表中所有重复结点,重复结点不保留

分析:
定义一个假的结点头,将所有的不重复的结点串在其后面,最后返回该假的结点头的next就可以了。
在这个题里面,难点是如何将所有的重复结点都跳过去?
因为重复的结点不止两个,可能有是三个,四个等等,因为不知道要跳过多少个重复的结点,所以在这里需要用到一个while循环。

程序:

public Node deleteDuplication() {
        Node fakeHead = new Node(-1);  //定义的虚拟结点,其中所有不重复的结点都串在后面
        Node lastNode = fakeHead ;  //记录新链表的尾巴
        Node cur = this.head;   
        //遍历原单链表,遍历的结束条件
        while (cur != null) {
            if (cur.next != null && cur.data == cur.next.data) {
                //因为里面的重复元素可能有多个,所以需要再写一个循环,让cur走。同时cur可能为空,所以cur的next可能造成空指针异常。
                while (cur.next != null&& cur.data == cur.next.data  )  {
                    cur = cur.next;
                }
                cur = cur.next;     //出来循环之后还应该再走一步,因为此时还没有完全跳过重复结点。
                lastNode .next = cur;  //因为过了上一组重复的结点之后,后面可能还会存在重复的结点,
               // 所以暂时先将cur绑起来,但是lastNode不能向后移,向后移了就相当于将后面的结点直接串      起来了。
            } else {
                //确定不重复的结点,挂在虚拟结点后面。
                lastNode .next = cur;
                lastNode = lastNode .next;
                cur = cur.next;
            }
        }
        return fakeHead .next;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值