以下是个人对所做过的LeetCode题中有关链表类型题的总结,博主小白啊,若有错误的地方,请留言指出,谢谢。

一、有关反转链表

反转链表是在单链表题中占很大的比例,有时候,会以各种形式出现在题中,是比较重要的知识点。

(1)题Reorder list中,思路为将链表一分为二,将后者反转以后,然后两链表交叉连接起来即可,这里值得注意的有:链表一分为二以后,前半段的链表最后要指向NULL,以形成两单链表的交叉链接的情况;另外一点是,当链表个数为奇数时,以快慢指针形式分割的链表,后半段的个数会多一个,所以,最后的时候,要判断后半段是否结束。

(2)题Reverse linked list ii中要反转链表中的一段,思路为:找到反转的起始点和其前缀,然后根据需反转的个数写一个for循环,来实现反转,这里用到的可以说是增加表头的反转(更多详见反转单链表)。这里值得注意的是,题中中给的范围和结点的对应。

(3)题Reverse nodes in k group 要以每K个结点为单位进行反转,思路为:先统计结点数,然后每K个结点进行反转 ,这里使用的技巧是,使用计数器,当num小于k时反转。每次反转结束,要更新前结点等。Swap nodes in pairs是上一题的当K等于2时的特殊情况,不过,因为只是每两个进行交换,所以不需要使用计数器,只要两两交换即可。

二、链表归并排序

(1)Merge two sorted lists 合并两链表,可以使用归并排序的思想,每次从表头取出值较小的结点,排到新链表中。这里值得注意的是,当链表中有一个提前结束时,要将另一个的剩下的结点链接到新链表中。Sort list是归并排序的链表实现。Merge k sorted lists 是对链表归并排序的延续,这里有三种方法:一是先合并两条,然后用新的去合并下一条,直到所有的都合并结束;二是链表两两合并,用形成的新链表列再两两合并,直到只剩下一条;三是使用优先队列,每次从队列头取出当前值最小的节点,形成新的链表。

三、快慢指针

这里以快慢指针形式的还有Convert sorted list to binary search tree、Sort list 、Linked list cycle、Linked list cycle ii、还有几题是快慢指针的另一种变形,总体来说,使用快慢指针的思想很重要。

(1)Linked list cycle、Linked list cycle ii都是快慢结点的应用,关键在理解题意。判断是否有环,看快慢指针是否相遇即可,找到环起点,只要在相遇点,一个放到链表表头,一个从相遇点,两者同步同速的走就行。

(2)Convert sorted list to binary search tree使用快慢指针找到根结点,然后递归实现就行。

四、删除结点

(1)Remove duplicates from sorted list删除重复结点,只保留一个重复结点,思路是,当当前结点cur和其next相等时,更新cur的next,不相等则cur前进。Remove duplicate from sorted list ii是前一题的升级版,只要结点值有重复的都删除,这时,因为可能删除头结点,所以要新建一个表头。思路:用前结点pre(初始为表头的前缀)的next和当前结点cur的next比较,若值相等,则cur前移,(是和cur->next比较而不是cur)这样的做的原因是为了方便pre位置的下一次确定。只有当pre和cur之间没有重复的时pre才移动,类似于1->2->3,pre为1,cur为2;当之间有重复的时候,只是更新pre的后缀而已,然后再移动cur继续比较。

(2)题remove nth node from the end of list中要删除指定的结点,这类题是快慢指针的另一种变形。思路:先快指针先走,然后快慢指针同时同速一块走。

五、其他

(1)题Add two numbers 中,两正整数以指针的形式表示,求其和,思路关键在于:对两链表中有一个提前结束的理解,这里可以采取有就加,没有就跳。另外一点是最高位的进位值得注意。

(2)题Partition list中,要将小于给定值的结点放在不小于给定值结点之前,且保持相对顺序不变。思路有几种(这里介绍两种):一是找到第一个不小于给定值的结点及其前缀,然后从这个结点开始向后遍历,将小于给定值的结点都插入到前缀和该结点之间(前缀要更新)

(3)Copy list with random pointer分三步,第一插入新结点,二调整random,三形成新链表。

转载于:https://www.cnblogs.com/love-yh/p/7286192.html

Leetcode中单链表题总结相关推荐

  1. 设计链表(Leetcode第707题)

    此题涵盖了链表的常见操作,是练习链表操作非常好的一道题目 此题涵盖了链表的常见操作,是练习链表操作非常好的一道题目 此题涵盖了链表的常见操作,是练习链表操作非常好的一道题目 题目描述: 设计链表的实现 ...

  2. 【LeetCode每日一题】——109.有序链表转换二叉搜索树

    文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[题目提示] 七[解题思路] 八[时间频度] 九[代码实现] 十[提交结果] 一[题目类别] 二叉树 二[题 ...

  3. dummy节点——leetcode链表题必备

    做leetcode链表题的时候,需要额外考虑链表头部的特殊情况.但是,往往考虑不够周全,导致最后通过不断试错,修改代码.代码变得臃肿,可读性差. 其实,引入一个dummy节点就可以解决大部分需要考虑头 ...

  4. 【Java】【leetcode第25题】K 个一组翻转链表

    文章仅供自己学习记录所用,若有侵权.联系我删除! 接着来个链表题(听说字节考了) [K 个一组翻转链表] 其实这道题是206题和24题结合的一个进阶版本,我觉得关键就是控制范围(反正我自己折磨了很久, ...

  5. [Leetcode][第109题][JAVA][有序链表转换二叉搜索树][分治][快慢指针][中序遍历]

    [问题描述][中等] [解答思路] 1. 分治 快慢指针 复杂度 class Solution {public TreeNode sortedListToBST(ListNode head) {ret ...

  6. leetcode每日刷题计划-简单篇day8

    leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...

  7. Leetcode重点250题

    LeetCode重点250题 这个重点题目是把LeetCode前400题进行精简.精简方法如下: 删除不常考,面试低频出现题目 删除重复代码题目(例:链表反转206题,代码在234题出现过) 删除过于 ...

  8. LeetCode部分刷题笔记!!!JavaScript!!!

    详细解说请看视频JS老毕:人人都能看得懂的Leetcode力扣刷题教程合集 边看视频边记录笔记!!!部分题目在视频中无! 文章目录 LeetCode第1题:1. 两数之和 LeetCode第2题:2. ...

  9. LeetCode代码刷题(17~24)

    目录 17. 电话号码的字母组合 18. 四数之和 19. 删除链表的倒数第 N 个结点 20. 有效的括号 21. 合并两个有序链表 22. 括号生成 23. 合并K个升序链表 24. 两两交换链表 ...

最新文章

  1. HDU1421 搬寝室
  2. 体验VS2017的Live Unit Testing
  3. 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.2
  4. java 静态代码块和spring @value注解注入执行顺序
  5. 监控长时间运行的查询(监控数据库性能的SQL )
  6. 六年级下册百分数计算题_六年级数学上册期末试卷(附答案)
  7. 关闭流时,抛出异常:java.io.IOException: Stream Closed
  8. IDEA 炫酷编辑器主题大全,真的好看
  9. lucene全文检索包括双层PDF
  10. 1.1信息安全基础概念
  11. ubuntu 文件名乱码
  12. 冠状病毒主题网页制作——疫情地图
  13. word如何调整字间距离_WORD如何调整行间距和字间距
  14. java 冒泡_Java中的冒泡排序
  15. Linus Torvalds 传记
  16. java配置文件密码加密解密_Java-从配置文件加密/解密用户名和密码
  17. 问题解决--npm install 安装依赖一直失败
  18. js-函数式编程-柯里化和语义化
  19. java计算上个工作日方法
  20. 新的研究评估Masimo ORi™反映中度高氧期间氧合状况的功能

热门文章

  1. 【代码】synchronized是可重入锁并且多个sync代码块顺序执行
  2. Hadoop Name node is in safe mode报错解决办法
  3. TCP协议的4次握手
  4. ReentrantLock锁
  5. Qt鼠标拖动绘制基本几何图形
  6. C++拷贝构造函数(深拷贝与浅拷贝)
  7. 单片机串行收发电路制作记录
  8. malloc和free的深层次分析
  9. Linux 下 离线下载服务部署 CCAA的安装使用
  10. linux root目录install,Linux如何建立、删除、切换目录?