递归实现反转链表

反转链表

http://www.nowcoder.com/questionTerminal/75e878df47f24fdc9dc3e400ec6058ca

function ReverseList(pHead)
{
// write code here

    举个例子,比如说现在有个一个链表四个节点: 1-> 2 -> 3 -> 4
    我们使用递归的方式来解决这个问题倒顺
    首先递归的结束条件就是当前这个节点为null或者当前节点的next指针为null的时候,返回这个节点,如果函数压栈到这个
    程度,说明函数已经执行到最后一个节点了,
    我们可以认为在递归函数体中的cur这个值等于最后一个节点4, 然后此时的pHead是倒数第二个节点3, 我们需要是3,
4两个节点进行交换,但是同时还不能修改cur的值(因为cur是我们最终需要返回的值,是新链表的头节点,也是旧链表的尾节
点),此时我们只能在pHead节点上做手脚了, 想一下 3.next是4 ,那3.next.next是不是就是null了,那我们可以直接
跳过4使用 3.next.next = 3, 这个语句的作用就是将3这个节点放到4这个节点的后面, 形成了 4-> 3这个以cur(4)为
头部的拥有两个节点的子链表; 下面我们在往上面递归的上一层想一下,上一层的phead是不是2呀, 2.next是不是3呀(重
点:这个地方是最容易不理解的,注意2此时指向的3节点的位置已经改变了,3现在在4后面了,所以说现在的链表大概类似这
样: 2 -> 3 -> null, 4-> 3-> null, 可以看到现在有两个3吗,注意这两个3是一个3,都是引用的一个节点 );
所以这一层递归可以这样理解: 2.next是3, 2.next.next是null,2.next.next = 2(注意2.next引用的是3节点),
所以形成了这个拥有三个节点的子链表: 4 -> 3 -> 2, 可以按照这个逻辑依次类推进行思考;
    递归函数最终还是返回的cur就链表的尾节点,新链表的头节点,从一开始cur指向就不发生改变,改变的只是其他子节点
的排列顺序
    难以理解:递归实现链表反转的的关键点就是引用
// 递归的结束条件
if (pHead === null || pHead.next === null) {
   return pHead
}
// 递归函数体
let cur = ReverseList(pHead.next);
pHead.next.next = pHead;
pHead.next = null;

// 递归的返回值
return cur;

}

全部评论
表面上一看是看不懂的,只有去深入理解才能得到其中的关键难点所在
1 回复 分享
发布于 2020-11-29 17:46

相关推荐

点赞 评论 收藏
分享
人力小鱼姐:实习经历没有什么含金量,咖啡店员迎宾这种就别写了,其他两段包装一下 想找人力相关的话,总结一下个人优势,结合校园经历里有相关性的部分,加一段自我评价
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务