剑指offer(面试题18):删除有序链表中的重复结点

/*
* 在一个排序的链表中,删除重复的结点(意味着连续出现相同的结点,这些的结点全部删除)
* 1. 注意头结点可能被删除,因此函数参数声明中应该使用二级指针指向头结点所在的指针
* 2.
*/

#include <iostream>
using namespace std;


struct ListNode {
  int value;
  ListNode* next;
};

void deleteDuplicatedNode(ListNode** pHead) {
    if(pHead == NULL || *pHead == NULL)
      return;
    ListNode* pPreNode = NULL;
    ListNode* pNode = *pHead;

    while(pNode != NULL) {
      ListNode* pNext = pNode->next;
      bool isNeedDeleted = false;

      if(pNext != NULL && pNext->value == pNode->value)
        isNeedDeleted = true;

      if(!isNeedDeleted) {
        pPreNode = pNode;
        pNode = pNode->next;
      } else {

        ListNode* pToDeleted = pNode;
        int value = pNode->value;
        while(pToDeleted->next != NULL && pToDeleted->value == value) {
          pNext = pToDeleted->next;
          delete pToDeleted;
          pToDeleted = NULL;
          pToDeleted = pNext;
        }

        if(pPreNode == NULL)
          *pHead = pNext;  //头结点被删除的情况
        else
          pPreNode->next = pNext;

        pNode = pNext; // 继续遍历
      }
    }
}

int main(int argc, char const *argv[]) {
  //testing cases
  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值