反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
方法:设置虚拟头节点。三个指针,pre,cur,next,其中i的位置是pre节点的位置。因为加了头节点,而且是从0开始索引,题目中m,n是从1开始索引,所以两者相抵,就不存在索引不一致的问题了。注意循环中i< m-1和 i< n ,均是pre的索引,穿针引线。
(1)设置虚拟头节点,下一个指向头节点,设置pre,等于虚拟头节点;
(2)开始遍历,找到要开始反转的位置
(3)开始反转,范围确定好。
(4)穿针引线,如下图所示,
/**
* 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* dummynode = new ListNode(0);
ListNode* pre = dummynode;
dummynode-> next =head;
for(int i = 0 ; i<m-1; i++ ) pre = pre->next; //找到反转点前一个的pre;
ListNode* cur = pre->next;
for(int i = m; i < n; i++){ //因为加入虚拟头节点,所以边界一定要注意
ListNode* next = cur->next; //更新指针。
cur->next = next->next;
next->next = pre->next;
pre->next = next;
}
ListNode* resnode = dummynode->next;
delete dummynode;
return resnode;
}
};