解决思路:
注意的要点是:m 可能位于头结点,所以这里临时建立一个节点,每次将cur后面的节点放到pre节点后边,这里的cur->next
其实是在一直变化的,所以这里cur并不用自己更新,每次进行重链接时相当于对链表进行了遍历。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
ListNode* new_head = new ListNode(0);
new_head->next = head;
ListNode* pre = new_head; // 保存m之前的节点
ListNode* cur = nullptr;
for(int i = 0;i < m - 1; i++) //找到m之前的那个节点
pre = pre->next;
cur = pre->next;
for(int i = 0; i < n - m; i++)
{
ListNode* move = cur->next;
cur->next = move->next;
move->next = pre->next;
pre->next = move;
}
return new_head->next;
}
};