折腾到现在,快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;
}