| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3772 人关注过本帖
标题:链表逆置,有没有更容易理解的算法。
只看楼主 加入收藏
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 
我没细看你的 就直接发上来了

哈哈 猜到应该是类似的了

[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-07-22 18:43
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 

#include<stdio.h>

#include<malloc.h>

#include<conio.h>


typedef struct Node

{

char data;

struct Node *next;

}Node,*NodePtr;


void main()

{

NodePtr head = (Node *)malloc(sizeof(Node));//头结点

NodePtr tail;//尾节点

head->next = NULL;

NodePtr p;

p = head ;

printf("*********************单链表逆置***********************\n");

/*初始化程序,建立单链表,从字母a到z的链表,有头结点*/

printf("正在初始化..\n");

for(int i=0;i<26 ;i++)

{

p->next = (Node *)malloc(sizeof(Node));

p = p->next;

p->data = 'a'+i;

}

p->next = NULL;

tail = p;

p = head;

while(p->next)

{

p=p->next;

printf("%c",p->data);

}

printf("\n任意键继续...\n");

getch();

while(head->next) //判断是否以及转置完毕

{

p=head; //初始化定位指针p的位置

while(p->next->next) //查找最后一个尚未转置的指针

p=p->next; //移动指针

p->next->next=p; //将最后的指针逆置

p->next=NULL; //添加尾部的标记

}

printf("\n逆置完成,结果如下\n");

p = tail;

while(p->next)

{

printf("%c",p->data);

p=p->next;

}

getch();

}
这是starrysky写的,其中红字好像不是注释的意思


2006-07-22 18:46
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 
以下是引用SunShining在2006-7-22 18:43:14的发言:
我没细看你的 就直接发上来了

哈哈 猜到应该是类似的了

呵呵,这也没什么的


2006-07-22 18:48
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 

typedef struct Node

{

char data;

struct Node *next;

}Node,*NodePtr;


我一见这种写法就蒙...


[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-07-22 18:54
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 
以下是引用SunShining在2006-7-22 18:54:43的发言:

typedef struct Node

{

char data;

struct Node *next;

}Node,*NodePtr;


我一见这种写法就蒙...

为什么蒙啊?那您就不用看那个了,直接看逆置那里吧
while(head->next) //判断是否以及转置完毕

{

p=head; //初始化定位指针p的位置

while(p->next->next) //查找最后一个尚未转置的指针

p=p->next; //移动指针

p->next->next=p; //将最后的指针逆置

p->next=NULL; //添加尾部的标记

}


2006-07-22 18:58
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 
啊..这种算法我以前见过..

忘了是不是见的那小子写的..

就是逐步逆转..不过我个人认为这种方法效率并不好

而且可读性比较差

[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-07-22 19:11
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 

while(head->next) //判断是否以及转置完毕

{

p=head; //初始化定位指针p的位置

while(p->next->next) //查找最后一个尚未转置的指针

p=p->next; //移动指针

p->next->next=p; //将最后的指针逆置

p->next=NULL; //添加尾部的标记

}
那您能解释下红字的意思吗?是怎样逐步转置的啊?


2006-07-22 19:18
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 

不好意思.刚回来

1.head->1->2->3->4->NULL

2.head->1->2->3->NULL
4->3

3.head->1->2->NULL
4->3->2

4.head->1->NULL
4->3->2->1

最后.p = tail;
p为head tail为 结点4 也就是尾结点

不知道我说明白没有..不明白再给你解释吧


[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-07-22 20:30
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 

那红字部分只是查找尾结点(当然.在这里不可以称为尾结点.应该是next=NULL的结点)的前一个结点

并不是逆转..所谓转那步是

p->next->next=p; //将最后的指针逆置

p->next=NULL; //添加尾部的标记

最后再转头结点.


[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-07-22 20:33
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-07-22 23:56
快速回复:链表逆置,有没有更容易理解的算法。
数据加载中...
 
   



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

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