反转链表 II(Reverse Linked List II)java_leetcode_92

本文提供了一种通过一趟扫描实现链表指定区间[m, n]内元素反转的方法。主要分为三步:定位m节点前驱节点、进行区间内元素反转、连接前后链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反转链表 II(Reverse Linked List II)java_leetcode_92

版权©: https://blog.youkuaiyun.com/zhangjingao/article/details/96965748

题干

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:
1 ≤ m ≤ n ≤ 链表长度。

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii

题解

  这个题其实思路我相信经常刷算法的人都是有的,就是分为三个步骤。

  1. 第一步:找到m的位置,记住m之前的一个链表节点,这个作为前面的部分prehead。
  2. 第二步:new一个新的节点newListNode,指向null,之后从链表的第m个节点到第n个节点,每一个节点都指向newListNode,然后newListNode再等于newListNode.next。这样就保证了最后到n的时候拿到的是反转后的头节点,然后将第一步的prehead指向这个newListNode,此时结果就是前面的部分加上反转后的部分。
  3. 第三步:将链表剩余的部门接在newListNode的最后,作为最后一部分。

代码

    public ListNode reverseBetween(ListNode head, int m, int n) {
        if (head == null || head.next == null || n == m) {
            return head;
        }
        ListNode result = head;
        ListNode preHead = null;
        int index = 1;
        ListNode newHead = null;
        //首先判断是开头是1还是中间的值开始反转
        if (m == 1) {
            while (index++ <= n) {
                ListNode temp = head;
                head = head.next;
                temp.next = newHead;
                newHead = temp;
            }
            result = newHead;
        } else {
            //首先遍历到需要反转的节点
            while (index < m) {
                index++;
                preHead = head;
                head = head.next;
            }

            //开始翻转
            while (index++ <= n) {
                ListNode temp = head;
                head = head.next;
                temp.next = newHead;
                newHead = temp;
            }
            //反转后将翻转开始前的节点衔接上反转后的节点头
            if (preHead != null) {
                preHead.next = newHead;
            }
            newHead = preHead;
        }
        ListNode tempHead = result;
        if (newHead != null) {
            while (tempHead.next != null) {
                tempHead = tempHead.next;
            }
            tempHead.next = head;
        }


        return result;
    }

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值