avatar
这道题贴过没有?# Programming - 葵花宝典
N*n
1
小题一道:
一个链表,每个节点里有俩指针Next和Ranext,各个节点的Next连接起来形成
一个单链表,最后一个节点的Next为NULL。每个节点Ranext指向链内某个节点。
没有任意两个Ranext指向同一个节点。输入这样一个链表,要求在O(N)时间内
复制出一个结构相同的链表。
avatar
c*t
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)时间内
: 复制出一个结构相同的链表。

avatar
N*n
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.

avatar
P*f
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)时间内
: 复制出一个结构相同的链表。

avatar
c*t
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空间

avatar
i*h
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)就没意思了。
:
: 空间

avatar
P*f
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)就没意思了。
:
: 空间

avatar
c*t
8

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

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

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

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

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

avatar
c*t
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 。
: 所以俺说你这有问题。

avatar
P*f
11
驽钝了,没得到它...
你贴个伪码吧? heihei

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

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

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

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

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

avatar
w*s
13
side branch updating 很容易。A->Nanext = a->Nanext->next
可以说一下这一段code如何work? 不是很了解
avatar
w*s
14
side branch updating 很容易。A->Nanext = a->Nanext->next
可以说一下这一段code如何work? 不是很了解
avatar
w*s
15
side branch updating 很容易。A->Nanext = a->Nanext->next
可以说一下这一段code如何work? 不是很了解
avatar
N*n
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? 不是很了解

avatar
r*m
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)就没意思了。
avatar
p*x
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) {

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。