开发技术 / 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 (九阴白骨瓜) 的大作中提到: 】