有原始单链表如下:
现要求反转前三个节点,结果如下:
递归方式:
ListNode successor = null;
// 输入一个节点head和n, 将「以head为起点」的链表前n个节点反转,并返回反转之后的头节点。
public ListNode reverseN(ListNode head, int n){
if(n==1){
successor = head.next;
return head;
}
ListNode last = reverseN(head.next, n-1);
head.next.next = head;
head.next = successor;
return last;
}
过程:
比全反转只是多了一个N的限制,最终获取某个节点作为head
下文的节点1,节点2···均指节点值为1的节点,节点值为2的节点。
以n=3为例,根据解法,需获取(head.next, 2)的解,再继续就是要要获取n=1的节点;
1、head为1节点,n=3,successor=null;
2、head为2节点,n=2,successor=null;
3、head为3节点,n=1,successor=null;
此时n=1正好满足跳出逻辑,successor指向节点4;而且返回的为节点3,也就是说last最终指向了节点3,而且最终返回的就是last节点。
4、递推操作已经结束了,接下来就是回归操作了,
由于上一步满足了n=1,直接返回了,所以head.next.next = head; 这行代码里的head在此时实际是节点2,那head.next就是节点3,再next则是赋值了,即节点3指向了节点2;
head.next = successor; 则把节点2指向了节点4
5、继续回归