力扣:92. 反转链表 II(Java)

目录

题目描述:

给你单链表的头指针 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]

代码实现:

java 复制代码
/**
 * 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) {
        ListNode tmp = new ListNode(-1);// 设置哑结点
        tmp.next = head;// 哑结点指向头节点
        // pre指向哑结点
        ListNode pre = tmp;
        // 使pre指向反转链表的前一个结点
        for (int i = 0; i < left - 1; i++) {
            pre = pre.next;
        }
        ListNode rightNode = pre;// 记录反转链表的前一个结点
        for (int i = 0; i < right - left + 1; i++) {
            rightNode = rightNode.next;// 找到反转链表的尾结点
        }
        ListNode leftNode = pre.next;// 记录反转链表的头节点
        ListNode endList = rightNode.next;// 记录反转链表的后一个结点
        // 断开原来链表:将需要反转的链表切割开
        pre.next = null;// 切割头节点
        rightNode.next = null;// 切割尾结点
        // 反转链表操作
        reverseLinkedList(leftNode);
        // 连接链表操作
        pre.next = rightNode;// 原先反转链表的前驱 指向 现在反转之后的链表的右节点(也就是现在的头节点)
        leftNode.next = endList;// 反转之后的链表左节点(也就是现在的尾结点) 指向 原先反转链表的后继
        // 返回哑结点的后继
        return tmp.next;// 这里不返回head结点的原因是:在反转操作时,head已经指向反转链表的尾结点了
    }

    // 反转函数反转了结点之间的指向,head指向的是反转之后的尾结点
    void reverseLinkedList(ListNode head) {
        ListNode cur = head;// 头节点开始遍历
        ListNode pre = null;// 前驱结点
        while (cur != null) {
            ListNode next = cur.next;// 记录后继结点
            cur.next = pre;// 结点指向前驱
            pre = cur;// 前驱指针指向当前结点
            cur = next;// 当前指针指向后继结点
        }
    }
}
相关推荐
不倒翁玩偶1 小时前
IDEA导入新的SpringBoot项目没有启动按钮
java·spring boot·intellij-idea
小小小米粒2 小时前
Maven Tools
java
铉铉这波能秀2 小时前
LeetCode Hot100数据结构背景知识之字典(Dictionary)Python2026新版
数据结构·python·算法·leetcode·字典·dictionary
kali-Myon2 小时前
2025春秋杯网络安全联赛冬季赛-day1
java·sql·安全·web安全·ai·php·web
我是咸鱼不闲呀2 小时前
力扣Hot100系列20(Java)——[动态规划]总结(下)( 单词拆分,最大递增子序列,乘积最大子数组 ,分割等和子集,最长有效括号)
java·leetcode·动态规划
唐梓航-求职中2 小时前
编程-技术-算法-leetcode-288. 单词的唯一缩写
算法·leetcode·c#
清水白石0082 小时前
深入解析 LRU 缓存:从 `@lru_cache` 到手动实现的完整指南
java·python·spring·缓存
Ll13045252982 小时前
Leetcode二叉树part4
算法·leetcode·职场和发展
符哥20082 小时前
C++ 进阶知识点整理
java·开发语言·jvm
@––––––3 小时前
力扣hot100—系列4-贪心算法
算法·leetcode·贪心算法