以下是个人对所做过的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 treeSort listLinked list cycleLinked list cycle ii、还有几题是快慢指针的另一种变形,总体来说,使用快慢指针的思想很重要。

(1)Linked list cycleLinked 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,三形成新链表。

Leetcode中单链表题总结的更多相关文章

  1. 【算法题 14 LeetCode 147 链表的插入排序】

    算法题 14 LeetCode 147 链表的插入排序: 解题代码: # Definition for singly-linked list. # class ListNode(object): # ...

  2. 【python】Leetcode每日一题-旋转链表

    [python]Leetcode每日一题-旋转链表 [题目描述] 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置. 示例1: 输入:head = [1,2,3,4,5] ...

  3. 【python】Leetcode每日一题-删除排序链表中的重复元素

    [python]Leetcode每日一题-删除排序链表中的重复元素 [题目描述] 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 . 返回同 ...

  4. 【python】Leetcode每日一题-删除排序链表中的重复元素2

    [python]Leetcode每日一题-删除排序链表中的重复元素2 [题目描述] 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表 ...

  5. 【python】Leetcode每日一题-反转链表 II

    [python]Leetcode每日一题-反转链表 II [题目描述] 给你单链表的头节点 head 和两个整数 left 和 right ,其中 left <= right .请你反转从位置 ...

  6. Leetcode OJ 刷题

    Valid Palindrome吐槽一下Leetcode上各种不定义标准的输入输出(只是面试时起码能够问一下输入输出格式...),此篇文章不是详细的题解,是自己刷LeetCode的一个笔记吧,尽管没有 ...

  7. Leetcode 第 2 题(Add Two Numbers)

    Leetcode 第 2 题(Add Two Numbers) 题目例如以下: Question You are given two linked lists representing two non ...

  8. LeetCode 86 | 链表基础,一次遍历处理链表中所有符合条件的元素

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第53篇文章,我们一起来看LeetCode第86题,Partition List(链表归并). 本题的官方难度是M ...

  9. 【LeetCode每日一题 Day 2】2. 两数相加

    大家好,我是编程熊,今天是LeetCode每日一题的第二天,一起学习的是LeetCode第二题<两数相加>. 题意 给你两个 非空 的链表,表示两个非负的整数.它们每位数字都是按照 逆序 ...

随机推荐

  1. MD5接口解密操作_接口签名校验

    很多HTTP接口在传参时,需要先对接口的参数进行数据签名加密如以下POST接口 http://localhost:8080/pinter/com/userInfo 参数为{"phoneNum ...

  2. CSP201509-2:日期计算

    引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...

  3. C复合文字

    C99之前,可以传递数组,但是没有所谓的数组常量可供传递,于是新增了复合文字. 普通数组声明方法: int d[2]={10,20}; 复合文字声明: 与数组名相同,常量同时代表元素的地址. (int ...

  4. 【模板】DFS

    int dx[] = { 0,1,0,-1 }; int dy[] = { 1,0,-1,0 }; void dfs()//参数用来表示状态 { if (到达终点状态) { ...//根据题意来添加 ...

  5. 【RL系列】Multi-Armed Bandit笔记补充(一)

    在此之前,请先阅读上一篇文章:[RL系列]Multi-Armed Bandit笔记 本篇的主题就如标题所示,只是上一篇文章的补充,主要关注两道来自于Reinforcement Learning: An ...

  6. 2018科大讯飞AI营销算法大赛全面来袭,等你来战!

    AI技术已成为推动营销迭代的重要驱动力.AI营销高速发展的同时,积累了海量的广告数据和用户数据.如何有效应用这些数据,是大数据技术落地营销领域的关键,也是检测智能营销平台竞争力的标准. 讯飞AI营销云 ...

  7. truffle运行特殊 无法找到module的处理方法

    https://blog.csdn.net/SnWJy/article/details/80549227 错误描述: ​ truffle项目根目录执行truffle compile时,报错'modul ...

  8. Some good articles

    https://alligator.io/vuejs/introduction-render-functions/ https://alligator.io/vuejs/vue-jwt-pattern ...

  9. Docker学习笔记总结

    Docker学习笔记 https://yeasy.gitbooks.io/docker_practice/content/   一 环境搭建 Ubuntu安装 .添加软件源的GPG密钥 curl -f ...

  10. Alpha冲刺——第三天

    Alpha第三天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...