反转链表

206. 反转链表

92. 反转链表 II

25. K 个一组翻转链表

 

这是这是这是最最最基础的一个题目,也是出现频率最高的一个题目

感觉每次都是稀里糊涂的把它写出来的,但是过很长时间重新去写的话,又会变得生疏很多

今天痛定思痛,把这一个类型的题目好好梳理一下

反转整个链表

首先我们先来看一看最最最基础的一种方式,反转整个链表,题目详情可见 反转链表。这里将给出两种实现方式:「迭代」和「递归」

9

先介绍迭代吧吧吧吧!!!

下面介绍第二种递归方式

递归之前,我们需要明确几个要素:明确 「当前节点」「该做什么」「什么时候做」「注意返回值」

1

执行完reverse(head.next)后,结果如下

2

此时我们需要对当前节点,也就是 head 节点做的就是:head.next.next = head; head.next = null;

反转链表前 N 个元素

先介绍迭代吧吧吧吧!!!

3

反转前 4 个元素,有没有很相似的感觉,就是改变了结束的最后一个元素。对于反转整个链表,结束元素是最后一个null;而对于反转前N个元素,结束元素是第N + 1个元素,即最初时应该prev = 5

我们需要先进行一个遍历,得到第五个节点

所以迭代的代码稍微修改一下就可以了

下面介绍第二种递归方式

「反转链表前N个元素」和「反转整个链表」其实前面都一样,唯一不同的就是结束条件,也就是 base case 不一样

对于「反转整个链表」,base case 为head.next = null;而对于「反转链表前N个元素」,base case 为head.next = the Node of (N+1)th

先直接看代码:

反转链表区间 [m, n] 的元素

题目详情可见 反转链表 II

先介绍迭代吧吧吧吧!!!

4

反转第 2-4 个元素,有没有更加熟悉的感觉,这种情况不仅改变了结束的最后一个元素,而且改变了起始的元素。对于反转整个链表,起始元素是head,结束元素是最后一个null;而对于反转前N个元素,起始元素是head,结束元素是第N + 1个元素;而对于反转区间[m, n]的元素,起始元素是m - 1个元素,结束元素是第n + 1个元素

所以迭代的代码稍微修改一下就可以了

下面介绍第二种递归方式

「反转链表区间[m, n]的元素」和「反转链表前N个元素」其实就是开始节点不一样而已

先直接看代码:

K 个一组翻转链表

今天 (2022-04-16 17:06:52) 更新一下本篇文章,新增一个内容,即:K 个一组翻转链表。题目详情可见 K 个一组翻转链表

思考了很久,本来想用迭代的方法去解决它,可是遇到了一个问题。处理第i组的时候无法获得第i + 1组的头节点,如图:

1

k = 2,当我们处理节点 1、2 的时候,最后我们需要把 1 -> 4,可是我们在处理 1、2 的时候暂时无法得到 3、4 处理完的头节点 4

很容易可以想到,其实这很类似于二叉树的后续遍历。处理当前节点时,需要用到子问题的结果

直接上代码: