链表逆置 m-n
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
using namespace std;
typedef long long ll;
typedef struct node
{
int data;
node* next;
} Node,*List;
Node* found()//创建链表
{
node* head=new Node;
head->next=NULL;
int n,x;
cin>>n;//输入节点个数
node *p=head;
for(int i=0; i<n; i++)
{
node* qq=new Node;
cin>>x;//输入该结点数据域
qq->data=x;
p->next=qq;
qq->next=NULL;
p=qq;
}
return head;
}
void Print(Node *head)
{
Node *p=head;
if(head->next==NULL)
{
printf("NULL\n");
return;
}
while(p->next)
{
printf("%d ",p->next->data);
p=p->next;
}
cout<<endl;
}
Node* Find(Node* head,int k)//寻找k节点
{
node* p=head->next;
if(!k)return head;
for(int i=1; i<k&&p; i++,p=p->next);
if(!p)
{
printf("没有该结点\n");
return NULL;
}
return p;
}
void fan(node *head)//反转单向链表
{
if(head->next==NULL||head->next->next==NULL)
{
return;
}
node *p;
node *q;
node *r;
p=head->next;
q=head->next->next;
head->next->next=NULL;
while(q)
{
r=q->next;
q->next=p;
p=q;
q=r;
}
head->next=p;
return;
}
void reverseBetween(node* head,int m,int n)
{
node* he=head->next;
if(!he||!he->next||n==m)return ;
List pre=NULL;
List p=head;
int temp_m=m;
int temp_n=n;
pre=Find(head,m-1);
p=Find(head,m);
List reverse_head = NULL;
List reverse_tail = p;
List reverse_tail_after = NULL;
List q = NULL;
while(temp_n-m>0)
{
q=p->next;
reverse_tail_after=q->next;
p->next=reverse_head;
reverse_head=p;
p=q;
temp_n--;
}
p->next=reverse_head;
reverse_head=p;
pre->next=reverse_head;
reverse_tail->next=reverse_tail_after;
}
int main()
{
List head=found();
int m,n;
while(cin>>m>>n)
{
reverseBetween(head,m,n);
Print(head);
}
return 0;
}