反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。 注意 m,n代表的是第几个结点,是从1开始的。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
结合图,就是说先找到m结点的前一个结点a和n结点的后一个结点b,再让m,n之间的的结点连接反向,比如a->b,现在变成b->a,
最后,让a的next指向n,m的next指向b,即可。
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if (m == n) return head;
auto dummy = new ListNode(-1);
dummy -> next = head;
auto a = dummy;
auto b = dummy;
for (int i = 1 ; i < m ; ++i){ // 找a 结点
a = a -> next;
}
for (int i = 1; i <=n+1; ++i){ // 找b 结点
b = b -> next;
}
auto p = a -> next;
auto q = p -> next;
auto c = q -> next;
while(q != b){ // 这个while循环的作用是使从第m个结点到第n个结点之间的指向关系反转。
c = q -> next;
q -> next = p;
p = q;
q = c;
}
a -> next -> next = b;
a -> next = p;
return dummy->next;
}
};