以下是个人对所做过的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. 『Golang』Go简介以及环境搭建

    简介 go语言是由Google进行维护的一个编程语言,发布自2009年.其以良好的编程风格.优秀的并发机制被广大的技术人员所接受. 使用go语言开发的优秀的产品: Docker gocode lime ...

  2. java 多维数组转化为字符串

    int[][] a = {{1,2,3},{4,5,7}}; System.out.println(Arrays.deepToString(a)); Arrays.deepToString()此方法是 ...

  3. Javascript打印网页局部的实现方案

    项目中,需要对页面的部分div进行打印,为了保证界面布局不乱,采取了新建iframe的方法. 将需要打印的div放到iframe中,然后调用iframe进行打印,就可以很好的实现局部打印的效果了. 同 ...

  4. jmeter属性设置

    使用${__setProperty(newuserid,1,)}函数对属性进行设置 2.使用${__P(userid)}函数在其他线程组中引用该属性 备注: 1.JMeter属性在测试脚本的任何地方都 ...

  5. TPO-13 C2 How to use language lab

    TPO-13 C2 How to use language lab 第 1 段 1.Listen to a conversation between a student and the languag ...

  6. Linearize an sRGB texture in Photoshop

    From:https://forum.unity.com/threads/bug-with-bypass-srgb-sampling.282469/

  7. C++0x,std::move和std::forward解析

    1.std::move 1.1std::move是如何定义的 template<typename _Tp> constexpr typename std::remove_reference ...

  8. poj 3468 (区间修改 区间查询)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions:147133   ...

  9. ZOJ 2760 How Many Shortest Path(最短路径+最大流)

    Description Given a weighted directed graph, we define the shortest path as the path who has the sma ...

  10. lintcode-18-带重复元素的子集

    带重复元素的子集 给定一个可能具有重复数字的列表,返回其所有可能的子集 注意事项 子集中的每个元素都是非降序的 两个子集间的顺序是无关紧要的 解集中不能包含重复子集 样例 如果 S = [1,2,2] ...