反转从位置 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
先根据m的值找到开始位置,然后通过m和n的差值来决定后一个值的位置.
然后动态的改变起始位置 和差值来找到结束的节点,并交换他们的值
/**
* 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)
{
if(head == NULL)
{
return NULL;
}
int count = 1;
int i = 0;
ListNode* save = head;
ListNode* myhead = head;
ListNode* tail = NULL;
for(i=0; i<m-1; i++)
{
myhead = save->next;
save= save->next;
}
save = myhead;
int var = n-m;
while(var > 0)
{
for(i=0; i<var; i++)
{
tail = save->next;
save= save->next;
}
int tmp = myhead->val;
myhead->val = tail->val;
tail->val = tmp;
//myhead = myhead->next;
save = myhead ->next;
myhead = myhead ->next;
var -=2;
}
return head;
}
};