206.反转链表
https://leetcode-cn.com/problems/reverse-linked-list/
题目描述
方法 1: 递归
思路
假设我们已经有了一个 F()
函数,它的功能就是反转链表,然后返回反转后链表的头部。
发现子问题
假设我们有一个链表,这个链表是不是可以分成两个部分:head
和 head.next 到链表尾部
。
那要反转这个链表,是不是可以先把 head.next 到链表尾部
这段进行反转,也就是说,要解决 F(head)
,我们可以先解决 F(head.next)
。
发现大问题和小问题的关系
很简单,只要把反转后的 head.next 到链表尾部
这段的最后一个节点指向 head
就好了。
但是 F()
函数只会返回反转后链表的头部啊,我们怎么知道链表的最后一个节点啊?
在调用 F(head.next)
之前先记录一下 head.next
就好啦,具体看代码注释吧。
递归出口
链表最后一个节点:只剩一个节点,直接返回它就好了。
空节点。
![](https://suki.gitbook.io/~gitbook/image?url=https%3A%2F%2Fcdn.jsdelivr.net%2Fgh%2Fsuukii%2F91-days-algorithm%2Fassets%2Freverse-a-linked-list-recursive.png&width=768&dpr=4&quality=100&sign=cfdca244&sv=2)
代码
JavaScript Code
方法 2: 循环
思路
初始化一个
prev
指针为 null,一个cur
指针为 head;开始遍历链表,在每一次循环中:
先保存
cur.next
;把
cur.next
倒转方向指向prev
;prev
和cur
都分别往前一步;
图解
![](https://suki.gitbook.io/~gitbook/image?url=https%3A%2F%2Fcdn.jsdelivr.net%2Fgh%2Fsuukii%2F91-days-algorithm%2Fassets%2Freverse-a-linked-list-loop.png&width=768&dpr=4&quality=100&sign=e3dbcc72&sv=2)
代码
Last updated
Was this helpful?