删除链表中重复的结点

《剑指offer》刷题笔记5

  1. 学习内容
    删除链表中重复的结点
    (1)思路
    使用三个指针。一个指向当前结点的最晚被访问不重复结点。一个指向当前结点。一个指向当前结点的最后一个重复结点。当前结点的下一个结点可能是重复结点、新结点(也就是不重复结点)、空。如果当前结点的下一个结点是重复结点,那么找到它最后一个重复的结点记作pNext。如果当前结点的下一个结点是空结点或者新结点,那就更新当前结点和当前结点的最晚被访问的不重复结点。
    (2)代码

/*
struct ListNode {
int val;
struct ListNode next;
ListNode(int x) :
val(x), next(NULL) {
}
};
/
class Solution {
public:
ListNode
deleteDuplication(ListNode
pHead)
{
ListNode* pPre=NULL;//最晚被访问的不重复结点
ListNode* pNode=pHead;//当前结点
ListNode* pNext=NULL;//与当前结点值相同的最后一个重复结点

  while(pNode!=NULL)
  { //当前结点的下一个结点是重复结点
    if(pNode->next!=NULL && pNode->val==pNode->next->val)
    {
      pNext=pNode->next;
      while(pNext->next!=NULL && pNext->val==pNext->next->val)
      {
        pNext=pNext->next;
      }
      if(pNode==pHead)
      {
        pHead=pNext->next;
      }
      else
      {
        pPre->next=pNext->next;
      }
      //下一个不重复结点
      pNode=pNext->next;
    }
    //当前结点的下一个结点是空或者不是重复结点
    else
    {
      pPre=pNode;
      pNode=pNode->next;
    }
  }
  
  return pHead;
}

};
2. 参考网站
https://cuijiahua.com/blog/2018/02/basis_67.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值