2.反转链表 II
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
#include<stdio.h>
#include<stdlib.h>
#define N 8
typedef struct node{
int data;
struct node*next;
}ElemSN;
ElemSN*creatlink(int a[])
{
//正向创建链表
ElemSN*head=NULL,*tail=NULL,*p;
for(int i=0;i<N;i++){
p=(ElemSN*)malloc(sizeof(ElemSN));
p->data=a[i];
p->next=NULL;
if(!head){
head=tail=p;
}
else{
tail=tail->next=p;
}
}
return
head;
}
void printlink(ElemSN*head)
{
for(ElemSN*p=head;p;p=p->next){
printf("%d\t",p->data);
}
}
//逆向创建链表
ElemSN*creatlink_inv(int a[])
{
ElemSN*head=NULL,*tail=NULL;
for(int i=0;i<N;i++){
tail=(ElemSN*)malloc(sizeof(ElemSN));
tail->data=a[i];
tail->next=NULL;
if(!head){
head=tail;
}
else{
tail->next=head;
head=tail;
}
}
return
head;
}
ElemSN*inv_a_lot_link(ElemSN*head,int m,int n)
{
ElemSN*h,*t,*tail,*p,*q;
int i=1,flag=1;
for(i=1,p=head;i<m;i++,q=p,p=p->next);
tail=p;
//中间尾删
if(m!=1&&flag){
while(m!=n){
t=p->next;
p->next=t->next;
t->next=tail;
q->next=t;
tail=q->next;
m++;
}
flag=0;
}
//头删
else{
while(m!=n){
t=p->next;
p->next=t->next;
t->next=head;
head=t;
m++;
}
}
return head;
}
int main()
{
int a[N]={3,2,5,8,4,7,6,9};
int m,n;
printf("请输入你的m,n:");
scanf("%d%d",&m,&n);
ElemSN*head;
ElemSN*head_inv;
ElemSN*head_inv_a_lot_inv;
//正向创建链表
head=creatlink(a);
//输出链表
printlink(head);
//逆向创建链表
/*printf("逆向创建链表:\n");
head_inv=creatlink_inv(a);
printlink(head_inv);*/
//反转一部分链表
printf("\n输出反转后的链表\n");
head_inv_a_lot_inv=inv_a_lot_link(head,m,n);
printlink(head_inv_a_lot_inv);
return 0;
}