力扣: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;// 当前指针指向后继结点
        }
    }
}
相关推荐
test猿8 分钟前
hive为什么建表,表存储什么
java
程序猿零零漆1 小时前
SpringCloud系列教程:微服务的未来(二十)Seata快速入门、部署TC服务、微服务集成Seata
java·spring·spring cloud·微服务
我的K84092 小时前
Spring Boot基本项目结构
java·spring boot·后端
因兹菜2 小时前
[LeetCode]day4 977.有序数组的平方
数据结构·算法·leetcode
码农小苏242 小时前
K个不同子数组的数目--滑动窗口--字节--亚马逊
java·数据结构·算法
CodeClimb3 小时前
【华为OD-E卷 - 最大矩阵和 100分(python、java、c++、js、c)】
java·c++·python·华为od·矩阵
独自破碎E3 小时前
【4】阿里面试题整理
java·开发语言·算法·排序算法·动态规划
customer0810 小时前
【开源免费】基于SpringBoot+Vue.JS体育馆管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
Miketutu11 小时前
Spring MVC消息转换器
java·spring
乔冠宇11 小时前
Java手写简单Merkle树
java·区块链·merkle树