NewCoder:删除链表的重复节点

题目来源

https://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef?tpId

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。

 示例
 
 链表1->2->3->3->4->4->5 
 处理后为 1->2->5

解题思路

  • 将不重复的节点串到另一个链表,最后返回另一个链表即可
    注:在处理重复节点时,会将一组相同节点的最后一个串进新链表,但是新链表的遍历节点cur1的位置没有移动。只有出现不重复节点时,才会移动cur1使得重复节点被覆盖。

图解

  • 初始未经处理的链表和pHead位置
    在这里插入图片描述
  • 遍历完成
    • 原链表和pHead位置
      在这里插入图片描述
    • 最后返回的链表和遍历节点cur1位置
      在这里插入图片描述

实现代码

public class ListNode {
     int val;
     ListNode next = null;

     ListNode(int val) {
         this.val = val;
     }
 }
    
public ListNode deleteDuplication(ListNode pHead) {
       if (pHead == null) {
           return pHead;
       }
       //用来标志新链表的头节点,方便最后给返回值
       ListNode newHead = new ListNode(-1);
       //newHead链表的遍历节点
       ListNode cur1 = newHead;
       while (pHead != null) {
           if (pHead.next != null && pHead.val == pHead.next.val) {
               while (pHead.next != null && pHead.val == pHead.next.val) {
                   pHead =pHead.next;
               }
               pHead = pHead.next;
               //此处虽然把重复的节点加进了新链表,但是最后覆盖掉了因为cur1位置没变
               cur1.next = pHead;
           } else {
               cur1.next =pHead;
               cur1 = cur1.next;
               pHead =pHead.next;
           }
       }
       return newHead.next;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值