反转链表前N个节点

有原始单链表如下:
在这里插入图片描述

现要求反转前三个节点,结果如下:
在这里插入图片描述
递归方式:

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、继续回归
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吊儿郎当当

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值