由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 这道题贴过没有?
相关主题
问个c++删除链表(linked list)节点的问题Boost.Serialization no longer maintained?
讨论 找单链表倒数m的节点 (转载)An Bloomberg interview question
C++(非VC++) 删除链表时如何对指针操作? 在线等回复!谢谢!这是什么算法?
好久没用C++了,想用静态变量写一个简单双向链表,一直报错越南问题 谁做出来了?
java 链表里面dummy node 一问?谢谢Scala又被鄙视了
删去单向LINKED LIST中的一个节点,假设HEAD is unknownHow to detect cycle with minimum space
求教:根据给定数组创建二叉树[合集] 快慢指针找链表中的环,别的步长行么?
Does C++ have serializer and deserialzier[合集] 关于求解链表中环的起始位置问题
相关话题的讨论汇总
话题: nanext话题: 节点话题: node话题: next话题: old
进入Programming版参与讨论
1 (共1页)
N********n
发帖数: 8363
1
小题一道:
一个链表,每个节点里有俩指针Next和Ranext,各个节点的Next连接起来形成
一个单链表,最后一个节点的Next为NULL。每个节点Ranext指向链内某个节点。
没有任意两个Ranext指向同一个节点。输入这样一个链表,要求在O(N)时间内
复制出一个结构相同的链表。
c*****t
发帖数: 1879
2
If can modify the original list (and then restore it back), can be
done in the following way I think:
original: a-b-c-d
new: a-A-b-B-c-C-d-D
Then can update the side branches. Then restore back.

【在 N********n 的大作中提到】
: 小题一道:
: 一个链表,每个节点里有俩指针Next和Ranext,各个节点的Next连接起来形成
: 一个单链表,最后一个节点的Next为NULL。每个节点Ranext指向链内某个节点。
: 没有任意两个Ranext指向同一个节点。输入这样一个链表,要求在O(N)时间内
: 复制出一个结构相同的链表。

N********n
发帖数: 8363
3
Modification is allowed.

【在 c*****t 的大作中提到】
: If can modify the original list (and then restore it back), can be
: done in the following way I think:
: original: a-b-c-d
: new: a-A-b-B-c-C-d-D
: Then can update the side branches. Then restore back.

P*****f
发帖数: 2272
4
我的思路
观察: 追逐Ranext 指针,可将老链表partition为多个disjoint cycles.
算法:
1.建立新链表时,第一次大循环pass只复制Nanext结构.
1.1 对老链表指针追逐,for current disjoint cycle
1.1.1 分配新链表对应节点,复制内容,并设置新链表节点相互之间的Nanext.
1.1.2 注意到此时
a) 老链表已经discovered得cycle节点其Nanext指针信息已复制到新链表中
,属于冗余,可利用为in-pace 空间
b) 其新链表对应的节点next指针不包含有效信息,可利用为in-place空间
for-each 新老节点对 in current cycle(老/新位置的对应有其在cycle
中的相对位置决定)做如下指针操作--为了将来在新链表中复制next结构:
1.1.2.1 老节点的Nanext指向新节点;
1.1.2.2 新节点的next指向老节点。
1.2 forward sca

【在 N********n 的大作中提到】
: 小题一道:
: 一个链表,每个节点里有俩指针Next和Ranext,各个节点的Next连接起来形成
: 一个单链表,最后一个节点的Next为NULL。每个节点Ranext指向链内某个节点。
: 没有任意两个Ranext指向同一个节点。输入这样一个链表,要求在O(N)时间内
: 复制出一个结构相同的链表。

c*****t
发帖数: 1879
5
写那么多,俺不是给了解么?O (1) space 。
a-A-b-B-c-C-d-D
(caps are new nodes).
side branch updating 很容易。A->Nanext = a->Nanext->next
所以俺就没提。
这道题要是按照正规的 serialization 办法解(O (n) space)就没意思了。

空间

【在 P*****f 的大作中提到】
: 我的思路
: 观察: 追逐Ranext 指针,可将老链表partition为多个disjoint cycles.
: 算法:
: 1.建立新链表时,第一次大循环pass只复制Nanext结构.
: 1.1 对老链表指针追逐,for current disjoint cycle
: 1.1.1 分配新链表对应节点,复制内容,并设置新链表节点相互之间的Nanext.
: 1.1.2 注意到此时
: a) 老链表已经discovered得cycle节点其Nanext指针信息已复制到新链表中
: ,属于冗余,可利用为in-pace 空间
: b) 其新链表对应的节点next指针不包含有效信息,可利用为in-place空间

i***h
发帖数: 12655
6
椰子大师对我贴的那个Cormen二叉树遍历的习题有解没有? 谢谢

【在 c*****t 的大作中提到】
: 写那么多,俺不是给了解么?O (1) space 。
: a-A-b-B-c-C-d-D
: (caps are new nodes).
: side branch updating 很容易。A->Nanext = a->Nanext->next
: 所以俺就没提。
: 这道题要是按照正规的 serialization 办法解(O (n) space)就没意思了。
:
: 空间

P*****f
发帖数: 2272
7
看了你那个,看起来好像差不多阿,不过你在原链表中interpolation,可以利用判断逻辑
更简单点.
BTW俺这个也是O(1)呀.

写那么多,俺不是给了解么?O (1) space 。
空间

【在 c*****t 的大作中提到】
: 写那么多,俺不是给了解么?O (1) space 。
: a-A-b-B-c-C-d-D
: (caps are new nodes).
: side branch updating 很容易。A->Nanext = a->Nanext->next
: 所以俺就没提。
: 这道题要是按照正规的 serialization 办法解(O (n) space)就没意思了。
:
: 空间

c*****t
发帖数: 1879
8

你搞错了吧。Nanext 是 side branch,不可能复制所有的 node 。
所以俺说你这有问题。

【在 P*****f 的大作中提到】
: 看了你那个,看起来好像差不多阿,不过你在原链表中interpolation,可以利用判断逻辑
: 更简单点.
: BTW俺这个也是O(1)呀.
:
: 写那么多,俺不是给了解么?O (1) space 。
: 空间

P*****f
发帖数: 2272
9
我不是说乐disjoint cycle么。一次追逐复制一个cycle。然后前进到下一个cycle.
关键是这个"前进到下一个cycle"无需回朔:因为可构造新老指针对在O(1)时间内判断
是否某节点已经复制。
就是说,复制整个Linkedlist得Nanext需要多个循环,但total复杂度仍然是O(n)

你搞错了吧。Nanext 是 side branch,不可能复制所有的 node 。
所以俺说你这有问题。

【在 c*****t 的大作中提到】
:
: 你搞错了吧。Nanext 是 side branch,不可能复制所有的 node 。
: 所以俺说你这有问题。

c*****t
发帖数: 1879
10
那为什么不直接用 next 复制 node ,然后 update 下 side branch,不更
简单?It's SLL...

【在 P*****f 的大作中提到】
: 我不是说乐disjoint cycle么。一次追逐复制一个cycle。然后前进到下一个cycle.
: 关键是这个"前进到下一个cycle"无需回朔:因为可构造新老指针对在O(1)时间内判断
: 是否某节点已经复制。
: 就是说,复制整个Linkedlist得Nanext需要多个循环,但total复杂度仍然是O(n)
:
: 你搞错了吧。Nanext 是 side branch,不可能复制所有的 node 。
: 所以俺说你这有问题。

相关主题
删去单向LINKED LIST中的一个节点,假设HEAD is unknownBoost.Serialization no longer maintained?
求教:根据给定数组创建二叉树An Bloomberg interview question
Does C++ have serializer and deserialzier这是什么算法?
进入Programming版参与讨论
P*****f
发帖数: 2272
11
驽钝了,没得到它...
你贴个伪码吧? heihei

那为什么不直接用 next 复制 node ,然后 update 下 side branch,不更
简单?It's SLL...

【在 c*****t 的大作中提到】
: 那为什么不直接用 next 复制 node ,然后 update 下 side branch,不更
: 简单?It's SLL...

P*****f
发帖数: 2272
12
大概知道了。的确方便很多,如果把两个链merge在一起。

驽钝了,没得到它...
你贴个伪码吧? heihei
那为什么不直接用 next 复制 node ,然后 update 下 side branch,不更
简单?It's SLL...

【在 P*****f 的大作中提到】
: 驽钝了,没得到它...
: 你贴个伪码吧? heihei
:
: 那为什么不直接用 next 复制 node ,然后 update 下 side branch,不更
: 简单?It's SLL...

w*********s
发帖数: 6
13
side branch updating 很容易。A->Nanext = a->Nanext->next
可以说一下这一段code如何work? 不是很了解
w*********s
发帖数: 6
14
side branch updating 很容易。A->Nanext = a->Nanext->next
可以说一下这一段code如何work? 不是很了解
w*********s
发帖数: 6
15
side branch updating 很容易。A->Nanext = a->Nanext->next
可以说一下这一段code如何work? 不是很了解
N********n
发帖数: 8363
16

roughly like this:
Node duplicate (Node original) {
Node old, clone, cloneHead;

if (original == null)
return null;

old = original;
while (old != null) {
clone = new Node ();
clone.nx = old.ranx;
old.ranx = clone;
old = old.nx
} // hook clone up with old

old = original;
while (old != null) {
clone = old.ranx;
clone.ranx = clone.ranx.ranx;
old = old.nx;
} // set clone.ranx

old = original;
cloneHead = old.ranx;
while (old.nx != null)

【在 w*********s 的大作中提到】
: side branch updating 很容易。A->Nanext = a->Nanext->next
: 可以说一下这一段code如何work? 不是很了解

r******m
发帖数: 6
17
大师,讲讲这个“正规的 serialization 办法”?
谢谢啊
发信人: coconut (向唐僧大师学习中), 信区: Programming
标 题: Re: 这道题贴过没有?
发信站: BBS 未名空间站 (Fri Jul 11 14:10:56 2008), 站内
写那么多,俺不是给了解么?O (1) space 。
a-A-b-B-c-C-d-D
(caps are new nodes).
side branch updating 很容易。A->Nanext = a->Nanext->next
所以俺就没提。
这道题要是按照正规的 serialization 办法解(O (n) space)就没意思了。
p****x
发帖数: 707
18
clone.ranx = clone.ranx.ranx;
where clone.ranx.ranx point to? thanks

【在 N********n 的大作中提到】
:
: roughly like this:
: Node duplicate (Node original) {
: Node old, clone, cloneHead;
:
: if (original == null)
: return null;
:
: old = original;
: while (old != null) {

1 (共1页)
进入Programming版参与讨论
相关主题
[合集] 关于求解链表中环的起始位置问题java 链表里面dummy node 一问?谢谢
关于链表(Linked list)删去单向LINKED LIST中的一个节点,假设HEAD is unknown
[合集] 关于C++ STL的list的一个问题求教:根据给定数组创建二叉树
[合集] 一个链表倒转的问题Does C++ have serializer and deserialzier
问个c++删除链表(linked list)节点的问题Boost.Serialization no longer maintained?
讨论 找单链表倒数m的节点 (转载)An Bloomberg interview question
C++(非VC++) 删除链表时如何对指针操作? 在线等回复!谢谢!这是什么算法?
好久没用C++了,想用静态变量写一个简单双向链表,一直报错越南问题 谁做出来了?
相关话题的讨论汇总
话题: nanext话题: 节点话题: node话题: next话题: old