这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战
题目描述:
206. 反转链表 – 力扣(LeetCode) (leetcode-cn.com)
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例一
输入: head = [1,2,3,4,5]
输出: [5,4,3,2,1]
复制代码
示例二
输入: head = [1,2]
输出: [2,1]
复制代码
示例三
输入: head = []
输出: []
复制代码
提示:
- 链表中节点的数目范围是
[0, 5000]
-5000 <= Node.val <= 5000
思路分析
迭代
链表有指向,反转只要把指向反过来就可以了。
我们只要记录下当前节点,前一个节点和后一个节点就行了,把当前节点的 next
指向当前节点的前一个节点
- 定义两个指针
pre
和cur
pre
最初指向null
因为第一个节点没有前节点- 每次迭代
cur
的next
指向pre
AC代码
class Solution {
fun reverseList(head: ListNode?): ListNode? {
var prev: ListNode? = null
var curr: ListNode? = head
var next: ListNode? = null
while (curr != null) {
next = curr.next
curr.next = prev
prev = curr
curr = next
}
return prev
}
}
复制代码
递归
- 使用递归函数,一直递归到链表的最后一个结点,该结点就是反转后的头结点,记作
prefix
- 此后,每次函数在返回的过程中,让当前结点的下一个结点的
next
指针指向当前节点 - 让当前结点的
next
指针指向null
,从而实现从链表尾部开始的局部反转 - 当递归函数全部出栈后,链表反转完成。
AC代码
class Solution {
fun reverseList(head: ListNode?): ListNode? {
if(null == head || null == head.next){
return head
}
val prefix = reverseList(head.next)
head.next.next = head
head.next = null
return prefix
}
}
复制代码
总结
这题用递归解的话主要就是递归不太好理解,甚至去翻题解看代码都是懵懵的,要实际去理解递归,还是要在纸上一步一步画一遍。
另外推荐下这个老哥的视频题解,讲的很透彻。
参考
反转链表 – 反转链表 – 力扣(LeetCode) (leetcode-cn.com)
动画演示+多种解法 206. 反转链表 – 反转链表 – 力扣(LeetCode) (leetcode-cn.com)
206. Reverse Linked List 反转链表 – 反转链表 – 力扣(LeetCode) (leetcode-cn.com)
简单易懂Java/C++ /Python/js 动画讲解 – 反转链表 – 反转链表 – 力扣(LeetCode) (leetcode-cn.com)
【反转链表】:双指针,递归,妖魔化的双指针 – 反转链表 – 力扣(LeetCode) (leetcode-cn.com)
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END