标题:链表倒置
只看楼主
purson
Rank: 1
来 自:天堂
等 级:新手上路
帖 子:25
专家分:0
注 册:2007-9-12
 问题点数:0 回复次数:8 
链表倒置
如何实现单链表以及循环链表的倒置?
搜索更多相关主题的帖子: 链表 倒置 
2007-09-14 07:01
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
得分:0 

用迭代可,用递归可

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

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


Fight  to win  or  die...
2007-09-14 12:48
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
得分:0 

头插法重新组建单链表.


倚天照海花无数,流水高山心自知。
2007-09-14 20:06
cobby
Rank: 1
等 级:新手上路
威 望:1
帖 子:565
专家分:0
注 册:2007-7-11
得分:0 
趁机做下广告呵。到我的博客上看看吧,上面不仅有算法还有源代码。内容很多呵,可供参考。

http://jiaxuanyao.blogms.com/blog/BlogView.aspx?BlogCode=jiaxuanyao

努力成为菜鸟!
2007-09-19 20:46
purehom
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-4-28
得分:0 
直接后置!
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;
}
2007-09-27 17:45
静思
Rank: 3Rank: 3
来 自:沈阳
等 级:新手上路
威 望:8
帖 子:630
专家分:0
注 册:2006-2-28
得分:0 

头插法实现单链表的逆置
改了下楼上的程序:
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;//节点后移
}
}


英者自知,雄者自胜
2007-09-29 12:47
ibiancheng
Rank: 1
等 级:新手上路
帖 子:148
专家分:0
注 册:2007-4-3
得分:0 
回复:(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编辑过]


执著的信念,坚定的自信,勤奋的努力才是通向成功的捷径! !!
2007-09-29 18:08
purson
Rank: 1
来 自:天堂
等 级:新手上路
帖 子:25
专家分:0
注 册:2007-9-12
得分:0 
多谢个位的指点啊,呵呵!
2007-11-18 21:59
hao02171990
Rank: 2
等 级:论坛游民
帖 子:17
专家分:17
注 册:2012-6-20
得分:0 
2013-04-19 11:42



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-169815-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.300342 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved