leetcode-92. 反转链表 II

本文最后更新于:2022年7月24日 下午

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

left和right只是第几个节点。

先找到left位置的节点的前一个节点,记为pre;这个pre的指向是永远不改变的。
然后left的位置的节点记为cur,下一个节点为next;
然后开始穿针引线;
把left后面的节点逐一地放到left前面,所以需要放right-left个节点;需要循环right-left次;

1
2
3
4
5
6
7
8
// 主要的循环体
for (int i = 0; i < right - left; i++) // [0, right-left-1] 共right-left次
{
next = cur->next;
cur->next = next->next;
next->next = pre->next;
pre->next = next;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int left, int right) {
ListNode* dummy = new ListNode(0);
dummy->next = head;

ListNode* pre = dummy;

// pre 走到 left的前一个位置
for (int i = 0; i < left - 1; i++)
{
pre = pre->next;
}

ListNode* cur = pre->next;
ListNode* next;
// 0,1 :循环改变的是left位置的节点的后面的节点,所以有 right-left个节点
for (int i = 0; i < right-left; i++)
{
next = cur->next; // 先 找到next
cur->next = next->next; // 1 变cur->next
// 2 变 next->next 用pre->next
next->next = pre->next;
pre->next = next;
}
return dummy->next;
}
};

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!