递归实现反转链表
反转链表
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;
}