92. 反转链表 II

题目内容

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

示例 1:

在这里插入图片描述

输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]

示例 2:

输入:head = [5], left = 1, right = 1
输出:[5]

提示:

链表中节点数目为 n
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n

进阶: 你可以使用一趟扫描完成反转吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

java解答

  • 说句实话,画图就简单好多了,这样更利于思考

  • 双百的操作

    记录下第left-1 left right right+1位置的节点

    反转left -right中的节点

    然后用left-1------>right left---->right+1

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
 //这题不画图,思路根本不清晰,差点绕进去了..
 
class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        int count=1;
        if(head==null||head.next==null){
            return head;
        }
        //申请个虚拟头结点,这样能保证如果left等于1的时候和等于其他的时候操作时一样的
        ListNode dummy=new ListNode(0);
        dummy.next=head;        
        //出来后cur指向第left-1个节点  count==left
        ListNode cur=dummy;
        while(count<left){
            cur=cur.next;
            count++;
        }
        ListNode left1=cur; //这个是第left-1个节点
        ListNode left2=cur.next; //这个是第left个节点
        cur=cur.next;
        ListNode temp=cur.next;
        //出来后count==right temp指向第right+1个元素,cur指向第right个元素
        while(count<right){
            //定义临时变量保存temp,以便给cur赋值,他就是下一步cur的位置
            ListNode zhong=temp;
            //temp更新为下一个节点
            temp=temp.next;
            //让没更新的temp位置节点指向没更新的cur
            zhong.next=cur;
            //cur更新为原来cur的下一位,即zhong,不能用cur=cur.next;因为后面的时候cur.next被改变了,第一次交换时候可以用,,因为你没更新left2的指向呢..
            cur=zhong;
            //count++;
            count++;
        }
        //让反转后的链表和不需要反转的链表连接起来..
        left1.next=cur;
        left2.next=temp;
        return dummy.next;
        
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值