作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5  处理后为 1->2->5

数据范围:链表长度满足 1<=n<=1000 ,链表中的值满足 1<=nval<=1000

进阶:空间复杂度O(n)  ,时间复杂度 O(n)

例如输入{1,2,3,3,4,4,5}时,对应的输出为{1,2,5},对应的输入输出链表如下图所示:

示例:

输入:

{1,2,3,3,4,4,5}

返回值:

{1,2,5}

解题思路:

本题考察数据结构链表的使用。本题常用两种解法。

  1. set遍历法。第一遍遍历用set存储重复的值,第二遍遍历将重复的值对应的结点删掉。该方法的好处是即使链表未排序,也能使用。
  2. 直接删除法。首先建立哨兵vhead,定义pre和cur前后指针进行遍历;遍历过程中如果出现前后重复的情况,则将cur连接到下一个非重复的结点,并重新将pre与其连接;若前后未重复,则前后指针同步向后进行;一次遍历完成后,重复的结点已删除。该方法适合已经排序的链表。

测试代码:

解法一:set遍历法

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};
*/
class Solution {
public:ListNode* deleteDuplication(ListNode* pHead) {if(!pHead)return pHead;set<int> s;ListNode *pre=pHead;ListNode *cur=pHead->next;// 第一遍遍历把重复的数值放入setwhile(cur){if(pre->val==cur->val){s.insert(pre->val);}pre=pre->next;cur=cur->next;}ListNode *vhead=new ListNode(-1);vhead->next=pHead;pre=vhead;cur=pHead;// 第一遍遍历把重复数值对应的结点删除while(cur){if(s.count(cur->val)){cur=cur->next;pre->next=cur;}else{pre=pre->next;cur=cur->next;}}return vhead->next;}
};

解法二:直接删除法

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};
*/
class Solution {
public:ListNode* deleteDuplication(ListNode* pHead) {if(!pHead)return pHead;ListNode *vhead=new ListNode(-1);vhead->next=pHead;ListNode *pre=vhead;ListNode *cur=pHead;// 遍历删除重复结点while(cur){// 如果有重复结点if(cur->next && cur->val==cur->next->val){cur=cur->next;// 若有连续重复的情况,将cur指向最后一次出现重复的结点while(cur->next && cur->val==cur->next->val){cur=cur->next;}// 连接下一个非重复的结点cur=cur->next;pre->next=cur;}// 若无重复结点,同步指向下一个else{pre=pre->next;cur=cur->next;}}return vhead->next;}
};

剑指offer(C++)-JZ76:删除链表中重复的结点(数据结构-链表)相关推荐

  1. 剑指Offer - 面试题3. 数组中重复的数字(哈希)

    1. 题目 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组 ...

  2. 剑指offer 面试题03. 数组中重复的数字

    找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...

  3. 剑指offer面试题03. 数组中重复的数字(Array)

    题目描述 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中 ...

  4. 剑指offer面试题[51]-数组中重复的数字

    题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...

  5. 剑指offer(C++)-JZ8:二叉树的下一个结点(数据结构-树)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结 ...

  6. 【算法】剑指offer - JZ76 删除链表中重复的结点

    题目链接 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 分析 1.确定去重的范围,采用 前开后闭 的方法. 2.增加一个头结点,统一操作. (pre ...

  7. 剑指offer——面试题57:删除链表中重复的结点

    剑指offer--面试题57:删除链表中重复的结点 Solution1: 删两遍,自己想的破算法.理论上时间复杂度也是O(n)O(n)O(n),并非最优解. /* struct ListNode {i ...

  8. 剑指offer:删除链表中重复的结点

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

  9. 剑指Offer(Java实现)删除链表中重复的结点

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

最新文章

  1. Windows 7运行命令大全
  2. 基于PyTorch框架的多层全连接神经网络实现MNIST手写数字分类
  3. 背包例题【dp练习】
  4. Hbase 协处理器 RegionObserver
  5. 使用window自带的截图工具
  6. 主成分分析、因子分析和聚类分析的区别
  7. 計蒜客/數正方形(dp)
  8. jQuery 实现邮箱输入自动提示功能:(二)
  9. 【STL记录】Containers--Lists
  10. 软件测试典型缺陷分析,软件测试缺陷分析方法简介
  11. 帝国cms网站迁移到新的服务器,帝国cms网站迁移教程
  12. MMS-MTK-Obigo03c
  13. 科普 | 处理器RISC和CISC架构分析对比
  14. 小学计算机的一些课题,小学信息技术课题申报题目参考
  15. 手机二维码扫码登录(Java源码及思路)
  16. django Auth用户登录
  17. c++ cin加速器
  18. vue es6转es5 保证浏览器兼容性
  19. vue集成vis-network实现拓扑图
  20. 音频电路设计中的基本知识(-)

热门文章

  1. Session何时创建实例
  2. 《编写高质量Python代码的59个有效方法》——第19条:用关键字参数来表达可选的行为...
  3. STL 源代码分析 算法 stl_algo.h -- includes
  4. 第20章 TCP的成块数据流
  5. 更改vmware esx机器的ip
  6. python 线程锁_Python多线程-线程锁
  7. python 构造函数_Python和其他编程语言的代码对比
  8. 【毕设】jsp+基于JB的人事管理系统(源代码+论文)
  9. python complex 如何取出实数部分_【PYthon报错】np.complex128数字的虚数部分为0j
  10. artcam 9.0英文版本下载_Jenkins版本升级(修复漏洞)