删除链表中重复的结点


题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5.
<span style="color:#FF0000;">思路:
定义指针pre、p初始化都指向pHead,然后用p遍历链表,
如果p.val和p.next.val值相同,则p往后移,如果不同,则比较pre和p(注意,此处不是比值,而是比较节点是否就是指向同一个),
如果pre和p相同,则表示p(pre)节点是不重复节点,将其加入新链表newHead中,同时pre和p往后移
如果pre和p不相同,则将pre指向p.next,p也往后移,
需要注意的是对于扫描到最后一个节点的处理,如果p.next==null则表示遍历到最后了,
如果pre和p相等,则该节点是不重复的加入到newHead中,
最后别忘记最后一个节点置为null</span>
<strong> public ListNode deleteDuplication(ListNode pHead)
    {
         ListNode p = pHead;//链表遍历指针
         ListNode newHead=new ListNode(-1);//用于存放不重复节点
         ListNode q=newHead;//新链表的构建指针
         ListNode pre=p;
         while(p!=null){
             if(p.next!=null&&p.val==p.next.val){//如果当前节点后下一个节点相同,则p往后移
                 p=p.next;
                  
             }else if(p.next!=null){//如果当前节点的值和后一节点的值不同,则当前节点是有可能不是重复节点,判断pre是否等于p
                 if(pre==p){//如果pre==p,说明p当前节点不是重复节点,则将该节点加入newHead中
                     q.next=new ListNode(p.val);
                     q=q.next;
                 }
                  pre=p.next;
                  p=p.next;
             }else{//如果p.next为null
                 if(p==pre){
                     q.next=new ListNode(pre.val);
                     q=q.next;
                 }
                 break;
             }
         }
         q=null;
         return newHead.next;
    }</strong>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值