反转链表

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;

}

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值