leetcode:单链表之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->nullptr, m = 2 and n = 4,
return 1->4->3->2->5->nullptr.
Note:
Given m, n satisfy the following condition: 1 m n length of list
即:给定一个链表,要求反转从第m个节点到第n个节点的子链表,要求一次完成扫描完成,且不能用额外的空间
m,n满足 1<=m<=n<=链表长度。
c++实现:
#include <iostream>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode (int x):val(x),next(NULL){ }
};
ListNode *createListNode(int arr[],int n)
{
ListNode *r;
ListNode *p;
ListNode * L=(ListNode*)malloc(sizeof(ListNode));
r=L;
for(int i=0;i<n;i++)
{
p=(ListNode*)malloc(sizeof(ListNode));
p->val=arr[i];
r->next=p;
r=p;
}
r->next=NULL;
return L->next;
}
ListNode *reverseBetween(ListNode *head,int m,int n)
{
ListNode dummy(-1);
dummy.next=head;
ListNode *prev_m,*prev=&dummy;
for(int i=1;i<=n;++i)
{
if(i==m)
prev_m=prev;
if(i>m && i<=n)
{
prev->next=head->next;
head->next=prev_m->next;
prev_m->next=head;
head=prev;
}
prev=head;
head=head->next;
}
return dummy.next;
}
int main()
{
int a[]={1,2,3,4,5};
ListNode *input = createListNode(a,5);
ListNode *out;
out=reverseBetween(input,2,4);
while(out != NULL)
{
cout<<out->val;
out = out->next;
}
cout<<endl;
return 0;
}
输出结果: