以下是个人对所做过的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. SpringBoot入门(四)——自动配置

    本文来自网易云社区 SpringBoot之所以能够快速构建项目,得益于它的2个新特性,一个是起步依赖前面已经介绍过,另外一个则是自动配置.起步依赖用于降低项目依赖的复杂度,自动配置负责减少人工配置的工 ...

  2. Python中安装Prophet

    1. 先安装pystan依赖 按照https://pystan.readthedocs.io/en/latest/windows.html说明,请使用如下命令 conda install libpyt ...

  3. cost加上了

  4. selenium自动化测试资源整理

    1. 所有版本chrome下载 是不是很难找到老版本的chrome?博主收集了几个下载chrome老版本的网站,其中哪个下载的是原版的就不得而知了. http://www.slimjet.com/ch ...

  5. Siki_Unity_1-1_Unity零基础入门_打砖块

    1-1 Unity零基础入门 打砖块 任务1:素材源码 www.sikiedu.com/course/77 任务2:Unity介绍 王者荣耀,球球大作战等游戏都是用unity开发的 跨平台的游戏引擎 ...

  6. 牛客练习赛26:D-xor序列(线性基)

    链接:牛客练习赛26:D-xor序列(线性基) 题意:小a有n个数,他提出了一个很有意思的问题:他想知道对于任意的x, y,能否将x与这n个数中的任意多个数异或任意多次后变为y 题解:线性基 #inc ...

  7. Java基础知识:Java实现Map集合二级联动1

    Java实现Map集合二级联动 Map集合可以保存键值映射关系,这非常适合本实例所需要的数据结构,所有省份信息可以保存为Map集合的键,而每个键可以保存对应的城市信息,本实例就是利用Map集合实现了省 ...

  8. EF中如何为表添加新的字段和映射

    首先先了解一下ef生成的模型edmx的代码,传送门:http://www.cnblogs.com/yushengbo/p/4807715.html 一.添加新的字段 例子就用我现在项目的这个吧,首先在 ...

  9. 剑指offer-从上往下打印二叉树22

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. class Solution: # 返回从上到下每个节点值列表,例:[1,2,3] def PrintFromTopToBottom( ...

  10. 《剑指Offer》题二十一~题三十

    二十一.调整数组顺序使奇数位于偶数前面 题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 测试用例: 功能测试:输入数组中的奇 ...