剑指offer--面试题24:反转链表

来源:互联网 发布:怎么学好数据库 编辑:程序博客网 时间:2024/06/05 15:56

#include<stdio.h>#include<malloc.h>//****************************************宏定义******************************************************typedef struct LNode{int           data;struct LNode  *next;}*LinkList; void Create_List_Tail(LinkList &L){int n;LNode *s,*p;   //s代表要插入的结点,p指向尾结点,L代表头结点printf("链表长为:");scanf("%d",&n);L=(LinkList)malloc(sizeof(LNode));  //建立头结点L->next=NULL;        //头结点指向空p=L;                 //p始终指向尾结点,初始化时也指向头结点for(int i=0;i<n;i++){s=(LinkList)malloc(sizeof(LNode));scanf("%d",&s->data);p->next=s;p=s;}p->next=NULL;      //尾指针指向空}//尾建表//************************************* Print_List(LinkList L)**************************************int Print_List(LinkList L){LNode *p=L->next;printf("打印链表: ");while(p){printf("%d ",p->data);p=p->next;}return 0;}//打印int Reverse_List_1(LinkList &L){LNode *p1,*p2,*p3;   if(L==NULL||L->next ==NULL)return 0;p1=NULL;     p2=L->next;   while(p2!=NULL) //p2为当前要操作的结点{p3=p2->next;  //p3记住当前结点的下一个结点p2->next =p1;  //使p2指向自己的前驱,完成反转p1=p2;  // p1和p2同时向后移动p2=p3;}L->next=p1;return 0;}int Reverse_List_2(LinkList &L){//从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后LNode *p1,*p2;if(L==NULL||L->next ==NULL)return 0;p1=L->next ;   //p1指向首结点while(p1->next){p2=p1->next;   //p2记住当前结点的下一个结点p1->next =p2->next ; p2->next =L->next ;L->next =p2;}return 0;}int main(){LinkList L;Create_List_Tail(L);printf("进行反转链表,");Reverse_List_1(L);Print_List(L);printf("\n\n");    printf("再次反转,");Reverse_List_2(L);Print_List(L);printf("\n\n");return 0;}