剑指offer(C++)-JZ76:删除链表中重复的结点(数据结构-链表)
作者:翟天保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}
解题思路:
本题考察数据结构链表的使用。本题常用两种解法。
- set遍历法。第一遍遍历用set存储重复的值,第二遍遍历将重复的值对应的结点删掉。该方法的好处是即使链表未排序,也能使用。
- 直接删除法。首先建立哨兵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:删除链表中重复的结点(数据结构-链表)相关推荐
- 剑指Offer - 面试题3. 数组中重复的数字(哈希)
1. 题目 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组 ...
- 剑指offer 面试题03. 数组中重复的数字
找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...
- 剑指offer面试题03. 数组中重复的数字(Array)
题目描述 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中 ...
- 剑指offer面试题[51]-数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- 剑指offer(C++)-JZ8:二叉树的下一个结点(数据结构-树)
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结 ...
- 【算法】剑指offer - JZ76 删除链表中重复的结点
题目链接 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 分析 1.确定去重的范围,采用 前开后闭 的方法. 2.增加一个头结点,统一操作. (pre ...
- 剑指offer——面试题57:删除链表中重复的结点
剑指offer--面试题57:删除链表中重复的结点 Solution1: 删两遍,自己想的破算法.理论上时间复杂度也是O(n)O(n)O(n),并非最优解. /* struct ListNode {i ...
- 剑指offer:删除链表中重复的结点
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
- 剑指Offer(Java实现)删除链表中重复的结点
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
最新文章
- Windows 7运行命令大全
- 基于PyTorch框架的多层全连接神经网络实现MNIST手写数字分类
- 背包例题【dp练习】
- Hbase 协处理器 RegionObserver
- 使用window自带的截图工具
- 主成分分析、因子分析和聚类分析的区别
- 計蒜客/數正方形(dp)
- jQuery 实现邮箱输入自动提示功能:(二)
- 【STL记录】Containers--Lists
- 软件测试典型缺陷分析,软件测试缺陷分析方法简介
- 帝国cms网站迁移到新的服务器,帝国cms网站迁移教程
- MMS-MTK-Obigo03c
- 科普 | 处理器RISC和CISC架构分析对比
- 小学计算机的一些课题,小学信息技术课题申报题目参考
- 手机二维码扫码登录(Java源码及思路)
- django Auth用户登录
- c++ cin加速器
- vue es6转es5 保证浏览器兼容性
- vue集成vis-network实现拓扑图
- 音频电路设计中的基本知识(-)
热门文章
- Session何时创建实例
- 《编写高质量Python代码的59个有效方法》——第19条:用关键字参数来表达可选的行为...
- STL 源代码分析 算法 stl_algo.h -- includes
- 第20章 TCP的成块数据流
- 更改vmware esx机器的ip
- python 线程锁_Python多线程-线程锁
- python 构造函数_Python和其他编程语言的代码对比
- 【毕设】jsp+基于JB的人事管理系统(源代码+论文)
- python complex 如何取出实数部分_【PYthon报错】np.complex128数字的虚数部分为0j
- artcam 9.0英文版本下载_Jenkins版本升级(修复漏洞)