【刷题-牛客】链表内指定区间反转

简介: 【刷题-牛客】链表内指定区间反转


题目链接

链表内指定区间反转_牛客题霸_牛客网 (nowcoder.com)

题目描述

核心思想

遍历链表的过程中在进行原地翻转

  • [m,n]翻转区间记作子链表,找到子链表的 起始节点 left 和 终止节点 right
  • 记录在链表中 子链表起始节点的前驱节点 leftPre 和子链表 终止节点的后继结点 rightNext
  • 对子链表进行反转处理后与leftPre 和rightNext重新相连
  • 为了防止头结点 head 的多种情况的讨论,选择 另声明一个虚拟头结点 newHead 作为遍历的起点

详细图解

  • 按图索骥


  • 开始头插


  • 头插结束


  • 子链表重新链接


代码实现

import java.util.*;
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param head ListNode类
     * @param m    int整型
     * @param n    int整型
     * @return ListNode类
     */
    //我们把[m,n]之间的节点当做是子链表
    public ListNode reverseBetween(ListNode head, int m, int n) {
        //虚拟头结点
        ListNode newHead = new ListNode(-1);
        newHead.next = head;//把虚拟头结点连入链表中
        //找到子链表的起始节点left和终止节点right(要求记录下左子链表左节点的前驱节点)
        ListNode leftPre = newHead;
        while (m > 1) {
            leftPre = leftPre.next;
            m--;
        }
        //while结束之后保留的leftPre即起始节点的前驱结点
        ListNode left = leftPre.next;//子链表的起始节点
        ListNode right = newHead;
        while (n > 0) {
            right = right.next;
            n--;
        }
        ListNode rightNext = right.next;//保留的rightNext即终止节点的后继结点
        //子链表进行头插
        ListNode subHead = left;//子链表的头结点
        ListNode cur = subHead.next;
        while (cur != rightNext) {
            ListNode curNext = cur.next;
            cur.next = subHead;
            subHead = cur;
            cur = curNext;
        }
        //开始链接子链表
        leftPre.next = subHead;
        left.next = rightNext;
        return newHead.next;//返回链表原头结点
    }
    static class ListNode {
        int val;
        ListNode next = null;
        public ListNode(int val) {
            this.val = val;
        }
    }
}

复杂度分析

  1. 时间复杂度
    O(N) ,最坏情况下,需要遍历整个链表
  2. 空间复杂度
    O(1) ,使用到常数个变量
目录
相关文章
|
3月前
|
Python
【Leetcode刷题Python】21. 合并两个有序链表
介绍了几种不同的方法来合并多个已排序的链表,包括暴力求解、使用小顶堆以及分而治之策略。
42 2
|
3月前
|
程序员
【刷题记录】移除链表元素
【刷题记录】移除链表元素
|
3月前
|
索引 Python
【Leetcode刷题Python】328. 奇偶链表
在不使用额外空间的情况下,将链表中的奇数和偶数索引节点重新排序的方法,并提供了相应的Python实现代码。
33 0
|
3月前
|
Python
【Leetcode刷题Python】25.K 个一组翻转链表
解决LeetCode "K 个一组翻转链表" 问题的三种方法:使用栈、尾插法和虚拟节点顺序法,并提供了每种方法的Python实现代码。
31 0
|
3月前
|
Python
【Leetcode刷题Python】114. 二叉树展开为链表
LeetCode上114号问题"二叉树展开为链表"的Python实现,通过先序遍历二叉树并调整节点的左右指针,将二叉树转换为先序遍历顺序的单链表。
28 3
【Leetcode刷题Python】114. 二叉树展开为链表
|
3月前
【刷题记录】链表的回文结构
【刷题记录】链表的回文结构
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
54 5
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
41 4
|
3月前
|
存储 Python
【Leetcode刷题Python】23. 合并K个升序链表
合并K个升序链表的方法:使用数组排序的暴力求解法、使用小顶堆的高效方法,以及分而治之的策略,并提供了相应的Python实现代码。
19 1
|
3月前
|
Python
【Leetcode刷题Python】138. 复制带随机指针的链表
LeetCode上题目“138. 复制带随机指针的链表”的Python解决方案,包括两种方法:一种是在每个节点后复制一个新节点然后再分离出来形成新链表;另一种是构建一个字典来跟踪原始节点与其副本之间的映射关系,从而处理新链表的构建。
22 1