注册 登录
编程论坛 数据结构与算法

链表倒置

purson 发布于 2007-09-14 07:01, 6343 次点击
如何实现单链表以及循环链表的倒置?
8 回复
#2
aipb20072007-09-14 12:48

用迭代可,用递归可

前者还简单些,从头开始取出结点,把这个结点当新链表的尾结点连接。

后者思想就是把头结点拿出来,把剩下的倒转,再在尾部添加头结点。

#3
nuciewth2007-09-14 20:06

头插法重新组建单链表.

#4
cobby2007-09-19 20:46
趁机做下广告呵。到我的博客上看看吧,上面不仅有算法还有源代码。内容很多呵,可供参考。

http://jiaxuanyao.blogms.com/blog/BlogView.aspx?BlogCode=jiaxuanyao
#5
purehom2007-09-27 17:45
直接后置!
void reserve(Listlist L){
Lnode *p;
p=L->next;
L->next=NULL;
while(p)
{ q=p;
p->next;
q->next=L->next;
L->next=q;
}
#6
静思2007-09-29 12:47

头插法实现单链表的逆置
改了下楼上的程序:
void reserve(LinkList L)
{
LinkNode *p,*q;
p=L->next;
L->next=NULL;
while(p)
{
q=p->next;//保存后续节点的指针
p->next=L->next;//头插法
L->next=p;
p=q;//节点后移
}
}

#7
ibiancheng2007-09-29 18:08
回复:(purson)链表倒置

//带头结点的链表建立
#include<stdio.h>
#include<malloc.h>
#include<conio.h>

typedef struct node{
int data;
struct node* next;
}LinkList;//数据结点

typedef struct{
int length;
struct node*next;
}Tnode; //头结点

Tnode *CreatList()
{//头插法建立单链表
Tnode *head;
LinkList *p;
int fg;
head=(Tnode *)malloc(sizeof(Tnode));
head->next=NULL;
printf("请输入链表中的数据(至少输入2个以上数据且以888结束):\n");
scanf("%d",&fg);
while(fg!=888)
{
p=(LinkList *)malloc(sizeof(LinkList));
p->data=fg;
p->next=head->next;
head->next=p;
scanf("%d",&fg);
}
if(fg==888)
printf("\n输入结束!\n\n");
return head;
}

Tnode *Creat_List()
{//尾插法建立单链表
Tnode *head;
LinkList *p,*pre;
int fg;
head=(Tnode *)malloc(sizeof(Tnode));
head->next=NULL;
printf("请输入链表中的数据(至少输入2个以上数据且以888结束):\n");
scanf("%d",&fg);
if(fg!=888)
{
p=(LinkList *)malloc(sizeof(LinkList));
p->data=fg;
p->next=NULL;
head->next=p;
pre=p;
}
scanf("%d",&fg);
while(fg!=888)
{
p=(LinkList *)malloc(sizeof(LinkList));
p->data=fg;
p->next=pre->next;
pre->next=p;
pre=p;
scanf("%d",&fg);
}
if(fg==888)
printf("\n输入结束!\n\n");
return head;
}

void ReadList(Tnode *head)
{//读取链表中的数据
LinkList *p;
p=head->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}

void ExchangeList(Tnode *head)
{//链表的倒置
LinkList *r,*s;
r=head->next;
head->next=NULL;
while(r)
{
s=r->next;
r->next=head->next;
head->next=r;
r=s;
}
}

void Readme()
{
printf("-------------------------------");
printf("链表的建立和逆置");
printf("--------------------------------\n");
printf("请选择操作:\n");
printf(" 1.头插法建立链表;\n");
printf(" 2.尾插法建立链表;\n");
printf(" 0.退出;\n");
printf("-------------------------------------------------------------------------------\n");
}

void main()
{
Tnode *head;
int choice;
while(choice)
{
Readme();
scanf("%d",&choice);
switch(choice)
{
case 1:
head=CreatList();
printf("链表中数据为:\n\n");
ReadList(head);
printf("\n");
ExchangeList(head);
printf("逆置后的链表中的数据为:\n\n");
ReadList(head);
getch();
break;
case 2:
head=Creat_List();
printf("链表中数据为:\n\n");
ReadList(head);
printf("\n");
ExchangeList(head);
printf("逆置后的链表中的数据为:\n\n");
ReadList(head);
getch();
break;
}
}
}

用VC++6.0做的

[此贴子已经被作者于2007-9-30 13:21:33编辑过]

#8
purson2007-11-18 21:59
多谢个位的指点啊,呵呵!
#9
hao021719902013-04-19 11:42
1