🤖
AI审核中

READING IN THE WILD · 读一篇手记

NC21 链表内指定区间反转

文章摘要

本文介绍了链表区间反转问题:在长度≤1000的单链表中,将第 m 到第 n 个节点的子序列逆序,要求时间O(n)。示例 1→2→3→4→5,m=2、n=4,结果为1→4→3→2→5。文章给出一种实现思路:遍历链表,将目标区间的节点值压入栈;再次遍历时弹栈并覆盖原节点值,从而完成逆序。该代码时间复杂度为O(n),但使用了栈导致空间复杂度为O(n),未满足进阶要求的O(1)空间。

题目链接:https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c

题目描述

将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n),空间复杂度 O(1)。
例如:
给出的链表为 1→2→3→4→5→NULL, m=2,n=4,
返回1→4→3→2→5→NULL.

数据范围: 链表长度 0<size≤1000,0<m≤n≤size,链表中每个节点的值满足 ∣val∣≤1000

要求:时间复杂度 O(n) ,空间复杂度 O(n)

进阶:时间复杂度 O(n),空间复杂度 O(1)

示例 1:

输入:{1,2,3,4,5},2,4
返回值:{1,4,3,2,5}

示例 2:

输入:{5},1,1
返回值:{5}

解题代码

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     *
     * @param head ListNode类
     * @param m int整型
     * @param n int整型
     * @return ListNode类
     */
    public ListNode reverseBetween(ListNode head, int m, int n) {
        // write code here
        Stack<Integer> stack = new Stack<>();
        ListNode temp = head;
        int i = 1;
        // 指定范围入栈
        while (temp != null) {
            if (i >= m && i <= n) {
                stack.push(temp.val);
            }
            temp = temp.next;
            i++;
        }
        temp = head;
        i = 1;
        // 指定范围出栈
        while (temp != null) {
            if (i >= m && i <= n) {
                temp.val = stack.pop();
            }
            temp = temp.next;
            i++;
        }
        return head;
    }
}

0 条评论

如果你觉得文章对你有帮助,那就请作者喝杯咖啡吧

评论区 0

头像
 0 条评论