LeetCode#206:反转链表之递归实现
程序员文章站
2024-03-09 14:23:29
...
不废话,直入主题(我是个很直接的人):
已知单链表,求反转:
1->2->3->4->5->null
期望效果:
null<-1<-2<-3<-4<-5
答题模版:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
}
}
冷静分析:(自行脑补熊猫头抽烟表情包)
我们要反转,那么涉及到俩个元素,当前节点currentNode,和currentNode.next节点,我们主要做的,是将curremtNode.next.next = currnetNode。
结合递归,我们肯定是从1递归到2,从2递归到3这样,举个例:
reverseList (currentNode = 1) {
saveNextNode = currentNode.mext = 2;
reverseList(1.next = 2)
}
reverseList (currentNode = 2) {
saveNextNode = currentNode.mext = 3;
reverseList(2.next = 3)
}
reverseList (currentNode = 3) {
saveNextNode = currentNode.mext = 4;
reverseList(3.next =4)
}
reverseList (currentNode = 4){
saveNextNode = currentNode.mext = 5;
reverseList(4.next = 5)
}
......
然后加上:递归返回条件,就是12345顺序递归那个条件:
//退出条件: < 1 - 2 - 3 - 4 - 5 - null >
if (currhead == null || currhead.next == null) {
return currhead;
}
然后我们再加上这行:核心替换逻辑
saveNextNode.next = currentNode;
最后再加上:斩断老的指向逻辑:
currentNode.next = null; //斩断老的指向
于是有代码:
private static ListNode reverse(ListNode currhead) {
//退出条件: < 1 - 2 - 3 - 4 - 5 - null >
if (currhead == null || currhead.next == null) {
return currhead;
}
//12345
ListNode nextNode = currhead.next;//保存下一个节点 4
ListNode newHead = reverse(nextNode);//递归 5
nextNode.next = currhead;//连上头与递归部分
currhead.next = null;//调整尾部
return newHead;//返回头节点
}
最后解释:
这个newHead,是返回到新的头节点,细品这个newHead,其实他就在第一次的时候用到了,之后对链表对改变并没有再用到这个newHead,只是一直传递到新的结尾处。至于为什么要返回这个头节点,只能说是惯例吧,一个链表肯定是先知道其head才好next下去嘛。
上一篇: web 容器的设计如何实现