Leetcode 92. 反转链表 II

Leetcode 92. 反转链表 II

原题链接


/**
 * 1. 找到第 m 个元素并记录下来,在查找第 m 个元素的同时,需要记录第 m-1 个元素的位置
 * 2. 依次反转第 m 个元素与第 m+1 个元素的关系,直到第 n 个元素
 * 3. 反转结束后,需要记录下第 n 个元素和第 n+1 个元素的位置
 * 4. 处理第 m-1 个元素与第 n 个元素的关系, (m-1).next = n
 * 5. 处理第 m 个元素与第 n+1 个元素的关系, m.next = (n+1)
 */
class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
        // 新建虚拟头节点
        ListNode dummy = new ListNode();
        // 让dummy.next指向head
        dummy.next = head;
        // mPrevNode 记录mNode的前一个节点
        ListNode mPrevNode = dummy;
        // mNode 会指向第 m 个元素
        ListNode mNode = head;
        // 从head开始沿着链表向后遍历,直到第 m 个元素
        for (int i = 1; i < m && mNode != null; i++) {
            mPrevNode = mNode;
            mNode = mNode.next;
        }

        if (mNode == null) {
            return dummy.next;
        }

        // 新建nNode指针,初始时指向mNode,从nNode开始反转链表
        ListNode nNode = mNode;
        // 新建nNextNode指针,在链表反转之前,记录 nNode.next,记录链表关系
        ListNode nNextNode = nNode.next;
        // 反转链表
        for (int i = m; i < n && nNextNode != null; i++) {
            ListNode mNextNextNode = nNextNode.next;
            nNextNode.next = nNode;
            nNode = nNextNode;
            nNextNode = mNextNextNode;
        }

        // 处理第 m-1 个元素与第 n 个元素的关系
        mPrevNode.next = nNode;
        // 处理第 m 个元素与第 n+1 个元素的关系
        mNode.next = nNextNode;
        return dummy.next;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值