Leetcode92:反转链表II(区间反转链表)

一、题目

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

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

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

left和right是索引,但是是从1开始(很无语,,,害我写了好多次才通过)

二、题解

思路:先找到left节点,再计算left到right中间的次数(就是要循环的次数),用3个指针:

  • preHead:指向left索引的上一位(他的next用来连接要插入到left头的节点)
  • pre:指向left索引
  • cur:指向left索引的下一位(要把cur插入到头部(即PreHead.next)去)

每次让left后面的节点(cur指针指向的元素)插入到left前面(preHead指针的位置)。即头插法(可以看我上一篇文章的反转链表的第一种解法,只是这里不创建新的节点,而是直接改变前后节点的指针;头插法就是依次把后面的元素插入到第一位去,一直到right结束,那么当前区间的链表就逆序了)

比如head = [1,2,3,4,5], left = 2, right = 4:

  • 3(cur指针指向的节点) 插入到2(pre指针指向的节点)的前面; [1,3,2,4,5]
  • cur指针往后移动
  • 4(cur指针指向的节点)插入到3(pre指针指向的节点)的前面: [1,4,3,2,5]

为了方便操作,设置一个虚拟头节点:
因为按照3个指针的写法,left位置前面是有一个节点的,但是如果要逆序的就是第一个和第二个,如果没有头节点,preHead就不存在了,就又要特殊处理。所以设置一个虚拟头节点让left不管是第一位还是第n位,都能走同样的逻辑。
第一遍:
在这里插入图片描述

第二遍:
在这里插入图片描述

class Solution {
   

    public ListNode reverseBetween(ListNode head, int left, int right) {
   
        if (left == right) {
   
            return head;
        }
        //创建一个虚拟头节点指向一开始的头节点
        ListNode dummy = new ListNode(-1,head);

        left = left - 1;
        right = right - 1;

        //要开始反转的节点的前一个节点
        ListNode preHead;
        head = dummy;
        //找到要翻转的起点 1->2->3->4->5->6
        //1->2->3->4->5->6 (2,4)
        for (int i = 0; i < left; i++) {
   
            head = head.next;
        }
        preHead = head;
        //反转的起点
        ListNode pre = preHead.next;
        // 要移动的节点
        ListNode cur = preHead.next.next;

        if (cur == null) {
   
            //链表只有两个节点 直接交换两个节点返回
            ListNode next = preHead.next;
            preHead.next = null;
            next.next = preHead;
            return next;
        }

        //要翻转的次数
        for (int j = 0; j < right-left; j++) {
   
             //暂存
            ListNode newHead = preHead.next;
            //暂存
            ListNode nextCur = cur.next; 

            pre.next = nextCur;
            preHead.next = cur;
            cur.next = newHead;

            //指针往前移动
            cur = nextCur;
        }
        return dummy.next;
    }
}
class ListNode {
   
    int val;
    ListNode next;

    ListNode() {
   
    }

    ListNode(int val) {
   
        this.val = val;
    }

    ListNode(int val, ListNode next) {
   
        this.val = val;
        this.next = next;
    }

    @Override
    public String toString() {
   
        return "ListNode{" +
                "val=" + val +
                ", next=" + next +
                '}';
    }
}

相关推荐

  1. leetcode 92. II

    2024-02-04 07:46:05       12 阅读
  2. 【递归】 92. II

    2024-02-04 07:46:05       33 阅读
  3. 【算法题】92. II

    2024-02-04 07:46:05       27 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-04 07:46:05       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-04 07:46:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-04 07:46:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-04 07:46:05       18 阅读

热门阅读

  1. LeetCode每日一题 | 1690. 石子游戏 VII

    2024-02-04 07:46:05       29 阅读
  2. EmoLLM-心理健康大模型

    2024-02-04 07:46:05       27 阅读
  3. 如何在linux中安装多个版本的python

    2024-02-04 07:46:05       35 阅读
  4. 深度学习的进展

    2024-02-04 07:46:05       35 阅读
  5. gpt今日最新新闻:gpts的广泛应用

    2024-02-04 07:46:05       31 阅读
  6. Node.js-1

    Node.js-1

    2024-02-04 07:46:05      25 阅读
  7. uniapp新增一条数据增加一个折叠栏

    2024-02-04 07:46:05       38 阅读