链表总结力扣206题反转链表迭代与递归解法
一、题目描述
反转一个单链表。 示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
二、解题思路
- 迭代
迭代思路很简单,就是从头往后逐个节点翻转链表。 每遍历到一个节点,就将该节点从链表中断开,让这个节点指针指向已反转部分链表。 代码如下:
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
if(!head || !head.next) return head //当链表为空,或链表只有一个节点,则直接返回
let p = null,z = head,y
while(z){ // 遍历链表直到该链表为null
y = z // 使y指向链表头节点,即用y变量存储第一个节点
z = z.next // 使z指向去掉头节点后的剩余链表
y.next = p // 将取下来的第一个节点y指针指向已经翻转的链表
p = y // 使p指向已翻转链表的头节点,即用p来存储已翻转部分的链表
}
return p
};
- 递归
递归的思路相对难以理解一点,和迭代不同的是,递归是从后开始翻转:
假如有这么个链表:
5 -> 7 -> 8 -> 4 -> null
当我们递归到4节点时因为该节点next指向null,所以我们默认该节点属于已经翻转的节点,直接返回该节点。
在8这个节点时,4->null默认已经翻转,我们此时要翻转 8 -> 4 -> null 这个链表,我们需要将4节点的next指向8,将8节点的next指向null,即:
8.next = 8.next.next // 8.next指向4节点,4.next=null,所以此处为null
4.next = 8
此时后面的链表部分 4->8->null
同理,递归到7这个节点,我们7节点后面的链表已经递归翻转完成,此时我们不能想的太绕,虽然7后面的链表翻转成为4->8->null,但是
7节点的next还是指向8节点的,而不是指向4节点,所以此时如上
7.next = 7.next.next // 7.next指向8节点,8.next=null,所以此处为null
8.next = 7
此时后面的链表部分 4->8->7->null
于是,重复这个步骤,这个链表就翻转完成。
代码如下:
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
if(!head || !head.next) return head
let tail = head.next,p = reverseList(head.next) // 此处p会始终返回原链表的最后一个节点,即新链表的第一个节点
head.next = tail.next // tail为当前head的next,所以此处是将当前head指向null
tail.next = head // 使当前指向null的head节点成为当前翻转后链表的最后一个节点
return p // 返回原链表的最后一个节点,即新链表的第一个节点,所以p也代表翻转后的整个链表
// 其实如下这样官方的题解更容易理解一点:
const p = reverseList(head.next)
head.next.next = head
head.next = null
return p
};
三、总结
这个题,也是一个力扣上的简单题,但是链表的递归还是有点绕的,但递归本质没变,还是从最终的界限开始计算的,也就是从后往前来翻转链表。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!