leetcode-92 反转链表II

题目描述如下:
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

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

示例:

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

很明显这个题目是206 反转链表的进阶版

需要记录第m-1个节点和第n+1个节点,因为这两个节点分别是当前链表逆置区域的头节点和尾节点,总体分为三步

  1. 获取逆置区域的头节点,即第m -1 个节点
  2. 逆置m – n个节点
  3. 获取第 n + 1个节点
  4. 链接逆置后区域的头部和尾部

在这里插入图片描述
实现如下:

ListNode* reverseBetween(ListNode* head, int m, int n) {
    int change = n - m + 1;
    ListNode *pre_head = NULL;
    ListNode *result = head;
    while(head && --m) {
        pre_head = head;
        head = head -> next;
    }

    ListNode *list_tail = head;
    ListNode *new_head = NULL;
    while(change && head) {
        ListNode *p = head -> next;
        head -> next = new_head;
        new_head = head;
        head = p;
        change --;
    }

    list_tail -> next = head;
    if (pre_head) {
        pre_head->next = new_head;
    } else {
        result = new_head;
    }
    return result;
}
发布了239 篇原创文章 · 获赞 17 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Z_Stand/article/details/104181635