折腾到现在,快1点了
今天想写个原地反转链表的代码,想了三种方法,先试写第一种。head ABCD NULL先变为head BCDA NULL再变为head CDBA NULL。。。。。如此变换
花了很长时间不过我觉得值了,以后得先思考所用的方法需要那些变量而不是盲目的敲代码。
当然for语句中的for敲成了while,找错找了好长时间,这个时间花的不值。
#include<stdio.h> #include<stdlib.h> struct node { int data; struct node *next; }; typedef struct node lnode; typedef struct node *list; list creat() { int N; int i,a; list tempnode,q; list head; printf("请输入链表结点个数\n"); scanf("%d",&N); head=NULL; printf("请输入数据\n"); for(i=1;i<=N;i++) //尾插法建立单链表,无表头 { tempnode=(list)malloc( sizeof(lnode) ); tempnode->next=NULL; scanf("%d", &a); tempnode->data=a; if(head==NULL) head=tempnode; else q->next=tempnode; q=tempnode; } return head; } list reverse(list head)//原地反转 { list tailnode,p,q; tailnode=head; p=head; q=NULL; while(tailnode->next!=NULL) tailnode=tailnode->next;//找到链表尾结点 while(p!=tailnode) { head=p->next;//记住p->next所指向的位置 //未反转的链表第一个结点插入到已反转链表的第一个位置 tailnode->next=p; if(q==NULL) p->next=NULL; else p->next=q; q=p;//记住已反转链表的第一个结点 p=head; } return head; } void output(list head) { list p; p=head; while(p!=NULL) { printf("%d\t",p->data); p=p->next; } printf("\n"); } int main() { list list_1,list_reverse; list_1=creat(); output(list_1); list_reverse = reverse( list_1 ); output(list_reverse); return 0; }