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

Solution1:

删两遍,自己想的破算法。理论上时间复杂度也是O(n)O(n)O(n),并非最优解。

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};
*/
class Solution {
public:ListNode* deleteDuplication(ListNode* pHead) { //有序单链表,就是考察链表的删除操作,但是删两遍if(pHead == NULL)return NULL;struct ListNode *temp = pHead, *dupli_node;int duplication = pHead->val; //用来记录结点的数值,初始化为首结点的值set<int> vec_set;  //用来存放所有重复过的数值while(temp->next != NULL) { //第一遍删除if(temp->next->val != duplication) { //不重复的情况duplication = temp->next->val;temp = temp->next;}else { //该结点的值vec_set.insert(duplication);dupli_node = temp->next;temp->next = temp->next->next;free(dupli_node);}}while(vec_set.find(pHead->val) != vec_set.end()) { //先找到链表起点dupli_node = pHead;pHead = pHead->next;free(dupli_node);if (pHead == NULL)//如果链表表头为空,要及时判断返回return NULL;   //此时对应着链表中所有结点的值都相同的情况}temp = pHead;//从新起点遍历删除第二遍,新起点肯定是未重复过的while(temp->next != NULL) { //if(vec_set.find(temp->next->val) != vec_set.end()){dupli_node = temp->next;temp->next = temp->next->next;free(dupli_node);}else temp = temp->next;}return pHead;}
};

Solution2:

书上的思路。这种方法是把结点值重复的链表结点给踢掉了,并没有主动释放内存空间。

/*
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 *pre = NULL; //指向前面最晚访问过的不重复结点ListNode *p = pHead; //指向当前处理的结点ListNode *q = NULL; //指向当前处理结点后面结点while (p) {//当前结点p,(其实是p指向当前结点),//与它下一个结点p->next的val相同,说明要删掉有这个val的所有结点if (p->next != NULL && p->next->val == p->val) {q = p->next;//找到q,它指向最后一个与p val相同的结点,那p 到 q (包含) 都是要删除的while (q != NULL && q->next != NULL && q->next->val == p->val) q = q->next;//如果p指向链表中第一个元素,p -> ... -> q ->... , 要删除p到q, //将指向链表第一个元素的指针pHead指向q->next。if (p == pHead) {pHead = q->next;} else //如果p不指向链表中第一个元素,pre -> p ->...->q ->... ,//要删除p到q,即pre->next = q->nextpre->next = q->next;//当前处理的p要向链表尾部移动p = q->next;} else {pre = p;p = p->next;}}return pHead;}
};

剑指offer——面试题57:删除链表中重复的结点相关推荐

  1. 剑指offer面试题[57]-删除链表中重复的结点

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

  2. 剑指offer(C++)-JZ76:删除链表中重复的结点(数据结构-链表)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回 ...

  3. 剑指offer——面试题51:数组中重复的数字

    剑指offer--面试题51:数组中重复的数字 Solution1: 20180910更新.利用数组做一次hash映射,时间复杂度为O(n)O(n)O(n),空间复杂度O(n)O(n)O(n). cl ...

  4. [剑指offer]面试题15:链表中倒数第k个结点

    面试题15:链表中倒数第k个结点 题目:输入一个链表,输出该链表中倒数第 k 个结点.为了符合大多数人的习惯,本题从1 开始计数,即链表的尾结点是倒数第1 个结点.例如一个链表有6个结点,从头结点开始 ...

  5. 剑指Offer - 面试题18. 删除链表的节点

    1. 题目 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点. 返回删除后的链表的头节点. 注意:此题对比原题有改动 示例 1: 输入: head = [4,5,1,9], val ...

  6. 剑指offer面试题15:链表中倒数第K个节点

    题目:输入一个链表,输出该链表的倒数第K个节点.为了符合大多数人的习惯,本题从1开始计数,即链表尾节点是倒数第一个节点. 解题思路: 解法一:一般情况下,单向链表无法从后一个节点获取到它前面的节点,可 ...

  7. 剑指offer面试题18. 删除链表的节点(双指针)(链表)

    题目描述 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点. 返回删除后的链表的头节点. 思路 详见链接 代码 class Solution:def deleteNode(self, ...

  8. 剑指offer——面试题15:链表中倒数第k个结点

    Solution1: 典型的双指针题目.但要考虑到很多边界条件! 注意此题中陷阱很多,具体看书中解释 20181008修改代码 /* struct ListNode {int val;struct L ...

  9. 剑指offer——面试题56:链表中环的入口

    剑指offer--面试题56:链表中环的入口 Solution1: 非常经典的快慢指针套路题.下面这个链接讲解的很详细.其实问题的关键在于为什么快指针的速度一定是慢指针的2倍,3倍或4倍行不行?? 快 ...

最新文章

  1. java类型转换_JAVA类型转换大全
  2. 对象存储使用案例_连云数据都有“对象存储”了,你还是单身?
  3. scikit-learn学习笔记(二)load_files加载自己的文件
  4. 【pyradiomics学习】——影像组学特征
  5. 【10.29周一电商,已好】中国日历的至高境界,377张震撼级插画,美到爆!
  6. 使用客户端对象模型读取SharePoint列表数据
  7. Java学习笔记13--比较器(Comparable、Comparator)
  8. 【代码优化】使用enum代替int常量
  9. matlab_取整函数
  10. python的口算自动生成系统(GUI界面编程)
  11. 计算机管理员的用户名市什么意思,电脑中的Administrator是什么意思?
  12. tx2上装scikit-image
  13. Android虚拟机和类加载机制
  14. 谭民机器人_机器人技术研究进展_谭民
  15. win10硬盘锁怎么解除_如何取消硬盘锁?
  16. 人体运动检测与跟踪(转)
  17. Win7升为Win10以及win7系统的重装
  18. 一篇文章带你玩转C语言基础语法。2:数据类型。千字总结
  19. 多进程concurrent.futures的ProcessPoolExecutor的一个注意点
  20. 微信小程序流量主怎么开通,小程序流量主开通步骤

热门文章

  1. .NET数据提供程序
  2. tensorflow随笔——concat(), stack(), unstack()
  3. java DTO循环_Java Stream与for循环比较
  4. 增量同步_实战 | canal 实现Mysql到Elasticsearch实时增量同步
  5. 浅谈java封装xml报文,XML报文转JAVA对象-JAVA对象转XML报文
  6. 参数调整 新部署rac_CDH5部署三部曲之三:问题总结
  7. 日历的java包_java11教程--包java.time.chrono介绍
  8. websocket没准备好如何解决_惠普打印机打印没反应如何解决 惠普打印机打印没反应解决方法【详解】...
  9. primefaces_Primefaces向导组件示例
  10. android实例教程_改造Android示例教程