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.
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.
#include <iostream>
using namespace std;
struct LinkNode
{
int data;
LinkNode *next;
LinkNode(int x):data(x),next(nullptr){}
};
LinkNode * reverseBetween(LinkNode *head,int m,int n)
{
LinkNode *dummy = new LinkNode(-1);
dummy->next = head;
LinkNode *pre = dummy;
//找到第m个的pre.挪动m-1次。
for(int i=1;i<m;i++)
{
pre = pre->next;
}
LinkNode *preFirst = pre;
LinkNode *First = pre->next;//第m个
LinkNode *cur = pre->next;
LinkNode *post = cur->next;
for(int i=m;i<n;i++)//逆转n-m次
{
LinkNode *tmp = post->next;
post->next = cur;
cur = post;
post = tmp;
}
preFirst->next = cur;
First->next = post;
head = dummy->next;
delete dummy;
return head;
}
//创建只有空链表,返回一个dummy节点
LinkNode * createLink()
{
LinkNode *dummy = new LinkNode(-1);
return dummy;
}
LinkNode * initLink(LinkNode *dummy)
{
//用一个数组初始化链表
int array[] = {1,2,3,4,5,6};
LinkNode *tmp,*head;
tmp = dummy;
//使用的是尾插入法
for(int i=0;i<sizeof(array)/sizeof(int);i++)
{
LinkNode *p = new LinkNode(array[i]);
tmp->next=p;
tmp = tmp->next;
}
head = dummy->next;
delete dummy;
return head;
}
//显示链表
void showList(LinkNode *head)
{
while(head)
{
printf("%d ",head->data);
head = head->next;
}
printf("\n");
return;
}
//摧毁链表
void desroyList(LinkNode *head)
{
while(head)
{
LinkNode *tmp = head->next;
delete head;
head = tmp;
}
return;
}
void main()
{
//创建一个空链表
LinkNode *dummy = createLink();
//对链表初始化,返回head
LinkNode *head = initLink(dummy);
//显示链表
showList(head);
//逆转m和n之间
head = reverseBetween(head,4,5);
showList(head);
//摧毁链表
desroyList(head);
}