题解 | 链表内指定区间反转

import java.util.*;

class ListNode {
    int val;
    ListNode next = null;

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

public class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode pre = dummy;
        
        // 找到反转部分的前一个节点
        for (int i = 0; i < m - 1; i++) {
            pre = pre.next;
        }
        
        // left指向反转部分的第一个节点
        ListNode left = pre.next;
        // right指向反转部分的最后一个节点
        ListNode right = left;
        
        // 移动right到反转部分的最后一个节点
        for (int i = 0; i < n - m; i++) {
            right = right.next;
        }
        
        // 记录反转部分后面的节点
        ListNode a = right.next;
        // 断开反转部分与链表的连接
        right.next = null;
        
        // 反转从left到right的部分
        reverseLink(left);
        
        // 将反转后的部分重新连接到链表中
        pre.next = right;
        left.next = a;
        
        return dummy.next;
    }

    private void reverseLink(ListNode left) {
        ListNode cur = left;
        ListNode pre = null;
        while (cur != null) {
            ListNode curn = cur.next;
            cur.next = pre;
            pre = cur;
            cur = curn;
        }
        // 反转完成后,pre指向新的头节点,left指向新的尾节点
        // 将left.next设置为pre,以便于外部方法连接反转后的链表
        left.next = pre;
    }
}

全部评论

相关推荐

06-26 17:24
已编辑
宁波大学 golang
迷失西雅图:别给,纯kpi,别问我为什么知道
点赞 评论 收藏
分享
07-16 18:03
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务