Reverse Linked List II
Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given 1->2->3->4->5->NULL
, m = 2 and n = 4,
return 1->4->3->2->5->NULL
.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
Subscribe to see which companies asked this question
解题技巧:
该题要求在原地反转,也就是不能申请额外的空间,且只能遍历一遍。因此,在遍历的过程中实现反转。
代码:
#include <iostream>
#include <stdlib.h>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* reverseBetween(ListNode* head, int m, int n)
{
ListNode *rehead, *ed1, *ed2, *bg1, *bg2, *p, *q, *r;
rehead = (ListNode *) malloc(sizeof(ListNode));
rehead->val = -1;
rehead->next = head;
p = rehead;
q = head;
for(int i = 1; i < m; i++)
{
p = q;
q = q->next;
}
bg1 = p;
ed1 = q;
for(int i = m; i <= n; i ++)
{
r = q->next;
q->next = p;
p = q;
q = r;
}
bg2 = p;
ed2 = q;
bg1->next = bg2;
ed1->next = ed2;
// cout<<bg1->val<<' '<<ed1->val<<' '<<bg2->val<<' '<<ed2->val;
return rehead->next;
}
int main()
{
ListNode *head = NULL, *tmp = NULL;
int m, n, x;
cin >> m >> n;
while(cin >> x)
{
tmp = (ListNode *) malloc(sizeof(ListNode));
tmp->val = x;
tmp->next = head;
head = tmp;
}
tmp = head;
while(tmp)
{
cout<<tmp->val<<' ';
tmp = tmp->next;
}
tmp = reverseBetween(head, m, n);
while(tmp)
{
cout<<tmp->val<<' ';
tmp = tmp->next;
}
}