力扣: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;// 当前指针指向后继结点
        }
    }
}
相关推荐
步、步、为营3 分钟前
.NET 事件模式举例介绍
java·开发语言·.net
cui_hao_nan6 分钟前
设计模式——模板方法
java·设计模式
小吕学编程6 分钟前
HttpServletRequest常用方法
java·http
在未来等你7 分钟前
Java并发编程实战 Day 11:并发设计模式
java·设计模式·多线程·并发编程·threadlocal·生产者消费者·读写锁
李少兄19 分钟前
解决 idea提示`SQL dialect is not configured` 问题
java·sql·intellij-idea
BreezeDove25 分钟前
IDEA安装&迁移IDEA配置数据位置
java·ide·intellij-idea
太阳之神aboluo29 分钟前
压测软件-Jmeter
java·运维·jmeter
编程乐学(Arfan开发工程师)42 分钟前
42、响应处理-【源码分析】-浏览器与PostMan内容协商完全适配
java·spring boot·后端·测试工具·lua·postman
珹洺1 小时前
数据库系统概论(十七)超详细讲解数据库规范化与五大范式(从函数依赖到多值依赖,再到五大范式,附带例题,表格,知识图谱对比带你一步步掌握)
java·数据库·sql·安全·oracle
用户79117724235831 小时前
黑马点评【基于redis实现共享session登录】
java·redis