92. 反转链表 II

题目描述:

吐槽:链表反转的升级版本,细致的题目,思路写完debug一点点调试,怎么都能过。修改完成总结一下会有比较大的收获。

代码:

public static ListNode reverseBetween(ListNode head, int m, int n) {
        //统计节点的个数
        int count = 1;
        //保存头部节点,用于返回值
        ListNode first = head;
        //反转链表需要的两个标记位顺序是 pre head next
        ListNode pre = null;
        ListNode next;
        //1.将head标记位移动到m的位置
        while(head!=null&&count<m){
            pre = head;
            head = head.next;
            next = head.next;
            count++;
        }
        //firstNode为需要反转节点的前一个位置。firstNextNode需要反转的节点
        ListNode firstNode = pre;
        ListNode firstNextNode = head;
        //2.把从m位置开始的节点进行链表的反转此时,head在n+1的位置。(我的反转逻辑只有在n+1的位置时,才能使m~n的节点都进行翻转)
        while(head!=null&&count<=n){
            next = head.next;
            head.next = pre;
            pre = head;
            head = next;
            count++;
        }
        //secondNode反转的最后一个节点,secondNextNode反转最后一个节点的下一个节点。
        ListNode secondNode = pre;
        ListNode secondNextNode = head;
        //3.情况分割:(1)当m>1的时候,将存储的4个节点进行拼接返回存储好的第一个节点,first
        //(2)当m=1的时候,将存储的4个节点进行拼接,返回进行翻转的最后一个节点secondNode。
        if(m > 1){
            firstNode.next = secondNode;
            firstNextNode.next = secondNextNode;
            return first;
        }else{
            first.next = secondNextNode;
            return secondNode;
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值