力扣: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 分钟前
Java源码中的排序算法(一)--Arrays.sort()
java·排序算法
阿里巴巴P8高级架构师8 分钟前
从0到1:用 Spring Boot 4 + Java 21 打造一个智能AI面试官平台
java·后端
stevenzqzq10 分钟前
trace和Get thread dump的区别
java·android studio·断点
桦说编程11 分钟前
并发编程踩坑实录:这些原则,帮你少走80%的弯路
java·后端·性能优化
程序猿零零漆11 分钟前
Spring之旅 - 记录学习 Spring 框架的过程和经验(十三)SpringMVC快速入门、请求处理
java·学习·spring
BHXDML11 分钟前
JVM 深度理解 —— 程序的底层运行逻辑
java·开发语言·jvm
tkevinjd13 分钟前
net1(Java中的网络编程、TCP的三次握手与四次挥手)
java
码头整点薯条13 分钟前
基于Java实现的简易规则引擎(日常开发难点记录)
java·后端
J2虾虾21 分钟前
Java使用的可以使用的脚本执行引擎
java·开发语言·脚本执行
老马识途2.027 分钟前
java处理接口返回的json数据步骤 包括重试处理,异常抛出,日志打印,注意事项
java·开发语言