链表反转 java 伪代码_【合集】链表翻转最少需要几个指针?

开发技术 / Algorithm /

阅读文章 版主 sunrise macintosh

/

转寄

/ 转贴 / 回信给作者 / 同主题阅读 /

返回讨论区 回复本文 上篇 本讨论区 下篇

发信人: macintosh (苹果~小m|信任), 信区: Algorithm

标 题: 【合集】链表翻转最少需要几个指针?

发信站: 兵马俑BBS (Tue Oct 24 16:33:53 2006), 本站(202.117.1.8)

☆──────────────────────────────────────☆

scheme 于

Fri Jun 16 18:02:48 2006 提到:

一般是三个 我听人说两个即可

不敢确认 请教各位

☆──────────────────────────────────────☆

Shader 于

Sat Jun 17 13:15:50 2006 提到:

两个应该是可以的

p=head; q=head->next;

while (q) {

(p, q, q->next) = (q, q->next, p);

}

实际上是要求 p, q, q->next完成了一次交换。

这个可以通过xor运算完成:

p=p^q^q->next;

q=p^q^q->next;

q->next=p^q^q->next;

p=p^q^q->next;

自己把强制类型转换加上就可以了。

【 在 scheme 的大作中提到: 】

☆──────────────────────────────────────☆

Tibet 于 Sat

Jun 17 13:47:16 2006 提到:

看不懂 - -~

这是什么语法啊

【 在 Shader (九阴白骨瓜) 的大作中提到: 】

☆──────────────────────────────────────☆

magi 于 Sat

Jun 17 18:55:51 2006 提到:

应该是C语言的伪代码吧。

【 在 Tibet 的大作中提到: 】

☆──────────────────────────────────────☆

xiaocui 于

Sun Jun 18 09:27:05 2006 提到:

【 在 Shader 的大作中提到: 】

你说的2个指针包不包括原来的头指针,如果不包括,

底下的代码就是2个指针的实现:

Item *head,*p,*q;

p=head->next;

head->next=NULL;

while(p!=NULL)

{

q=p->next;

p->next=head;

head=p;

p=q;

}

如果认为上面的是3个指针,那2个指针(比如说没有头指针)要想顺着链表一条线一次性翻转过来就不可行,因为

你在翻转前面的时候,节点的next已经改变,链表已经难以迭代下去,此时必须设置附加的中间指针保存下一步迭代的节点。

2个指针的方法:从开始找到链表尾,把链表尾的节点指向它的前一个节点,把前一个节点的next设为空。每次遍历都找到这个next为空的节点,把其next设为前一个节点。

开始:p=q,指向链表第一个节点。

while(p->next->next!=NULL)

p=p->next;

p->next->next=p;

p=p->next;//现在p为翻转后的第一个节点

p->next->next=NULL;//为下一次迭代构造循环结束条件

然后迭代遍历,就可以反转链表,不过可能没有人会这样做。

这样做其实仍然需要3个指针,不管反转过程动没动,它的作用有可能就是标记链表头的位置。像上面的迭代遍历过程,最后翻转完了却不知到反转链表的第一个节点在哪里。

综述:反转链表需要3个指针,有可能一个指针并没有移动,它就是标记链表的头位置(迭代遍历中会用到)。

即是不用3个指针,可能也会用到一个额外参数(比如链表节点个数),其实质说明仅靠2个指针完成这个工作很难或不可能。

☆──────────────────────────────────────☆

gdb 于 Sun

Jun 18 17:25:33 2006 提到:

q = p ^ q ^ q->next

之后,再使用

q->next

已经访问不到原来的那个“q->next”了 :(

【 在 Shader (九阴白骨瓜) 的大作中提到: 】

☆──────────────────────────────────────☆

Shader 于

Sun Jun 18 18:25:48 2006 提到:

边老师真牛。

不过有这个依赖关系,我觉得用这种异或交换的方法怎么都弄不出来了。

【 在 gdb 的大作中提到: 】

☆──────────────────────────────────────☆

xjtuctf 于

Mon Jun 19 13:27:51 2006 提到:

这个人链表的类型有关的

【 在 Shader 的大作中提到: 】

☆──────────────────────────────────────☆

xiaocui 于

Mon Jun 19 14:44:28 2006 提到:

【 在 xjtuctf 的大作中提到: 】

说得就是单链表。2个指针不行,必须有3个指针,才能遍历链表一次完成逆转。若要多次遍历链表,实现逆转,2个指针可以,但需要一个变量记录链表的节点总数(或增加一个指针记录新的链表头)。

☆──────────────────────────────────────☆

scheme 于

Mon Jun 19 15:28:59 2006 提到:

这里三元组的置换比较有意思,用xor可以避免使用临时变量

例如:

(a,b,c)==>(b,c,a)

步骤:

a := a^b^c

c := a^b^c

b := a^b^c

a := a^b^c

我形式化如下:

首先任取a,赋以a^b^c

假定某步X被赋值,则下一步给最终要替换成X的那个元素赋值

【 在 Shader (九阴白骨瓜) 的大作中提到: 】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值