您的位置:首页 > 理论基础 > 数据结构算法

数据结构------实现链表的反转

2012-10-02 10:14 387 查看
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct ListNode{
int data;
struct ListNode *next;
}inversList;

/*这个函数实现创建链表*/
inversList *createList()
{
inversList *head=NULL,*a=NULL,*b=NULL;   //定义了指针之后最好清空,以免野指针的出现,
//比如这里的head如果不设置为null的话,下面的oldList==NULL就会导致系统提示调试错误。。。
while(1)
{
if(NULL==(b=malloc(sizeof(inversList))))
{
printf("内存申请失败");
exit(1);
}                                    //为指针b分配内存空间

printf("输入一个数:");
scanf("%d",b);                        //输入数存入b指向的内存空间

if(0==b->data) break;                //直到输入0时,循环结束输入节点

b->next=NULL;                        //将b的next域设置为空,防止野指针出现

if(NULL==a)
{
a=b;
head=a;
}
else
{
a->next=b;
a=b;
}
}
return head;
}

/*这个函数实现链表的反转*/
inversList *invert(inversList *next,inversList *prior)
{
inversList *head=next;
if(NULL!=next->next)
{
head=invert(next->next,next);
}
next->next=prior;
return head;
}

int main(void){

inversList *head,*oldList,*newList;
printf("------------下面开始创建链表:---------\n");

head=createList();     //这里开始创建链表。。。并定义一个指针oldList指向链表的头节点head,以便于下面链表的输出表示。
oldList=head;

if(oldList==NULL)
exit(1);        //要先判断,在执行。判断链表是不是为空,如果是就直接退出程序,否则继续执行。。。

else
{
printf("The origin of the List is:");

while(oldList!=NULL)
{
printf("%d",oldList->data);
oldList=oldList->next;
}

newList=invert(head,NULL);  //定义一个newList指针,指向反转后链表的头节点
printf("\nThe result of the List is:");

while(newList)
{
printf("%d",newList->data);
newList=newList->next;
}
printf("\n");
}
free(oldList);           //指针用完后一定要释放归还给系统,以免野指针出现。。。
free(newList);
return 0;
}

/*
总结一下创建一个链表的几个步骤:

1 – 创建链表前,首先要知道链表里的节点中,保存的数据都有哪些,因此我们要先声明节点的结构体数据类型;
2 – 为了链表的操作,我们肯定要创建工具指针,因为它们会帮助我们始终指向我们想要指向的地方;
3 – 申请空间后一定要验证空间的可用性;
4 – 录入数据后,要判断数据的录入是否具有延续性,还是一次性;
5 – 录入数据完毕后,切记要让最后一个节点指向NULL;
6 – 用完链表后,记得有malloc,就要有free;
7 – 回收工具指针;
8 – 返回成功代码。

*/


此程序使用非循环的方式完成链表的反转,利用递归方法实现,完美通过运行,面试可能会用到,有兴趣的看看。。。。。。

//不带头结点的链表___链表反转---递归实现
Node *reverseList_isHead(Node *head)
{
if(NULL==head||NULL==head->next)
return ;
Node *p=reverseList_isHead(head->next);
head->next->next=head;
head->next=NULL;
return p;
}
//不带头结点的链表___链表反转---非递归实现算法
Node *reverseList_isHead(Node *head)
{
if(NULL==head||head->next==NULL)
return ;
Node *p=head->next,
*q;
head->next=NULL;
while(p!=NULL);
{
q=p->next;
p->next=head;
head=p;
p=q;
}
return head;
}

//带头结点的链表___链表的反转---非递归实现
Node * reverseList_noHead(Node *head)
{
if(NULL==head||NULL==head->next)
return;

Node *p,*q,*t;
p=head->next;
q=p->next;
while(NULL!=q)
{
t=q->next;
q->next=p;
p=q;
q=t;
}
head->next->next=NULL;
head->next=p;
return head;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: