92:翻转链表II

问题描述

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

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

示例

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

问题分析

这题我们需要找到一个结点,然后不断的将m到n之间的元素进行头插法,我们还需要记录一下第m个结点,因为我们待会儿还要让它指向第n个结点的下一个结点。
对了,我们一般来说都要给单链表安一个头,这样的话我们就可以对每个结点都用相同的算法了。

AC代码

class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
        ListNode cur = head;
        head = new ListNode(-1);
        head.next = cur;
        ListNode last = head;
        int count = n-m+1;
        int i = 1;
        for(;i < m; i++){
            last = last.next;
            cur = cur.next;
        }
        ListNode first = cur; // 记住第m个结点
        ListNode curr = null;
        for(int j = 0; j < count; j++){
            curr = cur;
            cur = cur.next;
            curr.next = last.next;
            last.next = curr;
        }
        first.next = cur;
        return head.next;
    }
}
发布了333 篇原创文章 · 获赞 22 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41687289/article/details/103807810
今日推荐