2014-08-29 86 views
0

我有两个单独的链接列表,它们在某处连接在一起,我必须找到那个点。我想如果我可以添加一个名为visited(flag)的新数据类型,以便可以使第一个链接的所有节点列表为已访问,然后找到从第二个链接列表遍历的交点。我可以这样做吗?可以在定义它之后修改结构吗?如果是,如何?提前致谢。可以修改一个结构吗?

+0

你能张贴一些代码来说明你在想什么吗? – 2014-08-29 03:34:19

+2

还有其他方法可以找出2个链接列表的交点。不要增加你的代码复杂度。据我所知,你一旦定义就不能修改结构。 – 2014-08-29 03:34:36

回答

4

不,您不能在运行时从结构中添加或删除成员。

3

考虑两个样本列表AB。你不知道他们在哪里相交,但是你走过这两个,你知道它们的长度:

A : A1 > A2 > A3 > A4 > NULL   <-- length 4 
B : B1 > B2 > B3 > B4 > B5 > B6 > NULL <-- length 6 

如果有一个交叉点,的Ai一些内存地址是要等于Bj的内存地址1 <= i <= 43 <= j <= 6

为什么?

如果A1地址等于B1B2的地址(如果任一这些节点的是交叉点),则链接列表A真的会两个节点或一个节点更长。但我们知道这不是事实,因为我们遍历了A,我们已经知道它有多长。

因此,您可以做的是找到长度差异,并在两个列表中较长的时间内遍历差异 - 交叉点节点(如果存在)将位于较长列表的尾部。然后开始遍历这两个列表,当你去时测试指针是否相等:

# we know B is longer, but you would test this 
# condition and set up different code to handle 
# the two cases 

unsigned int A_len = 4; 
unsigned int B_len = 6; 
unsigned int AB_diff = B_len - A_len; 
struct foo *A_head = ...; # user-defined 
struct foo *B_head = ...; # user-defined 
struct foo *A_iter = NULL; 
struct foo *B_iter = NULL; 

# - start the A-iterator at the first node of A 
# - start the B-iterator at the diff-th node of B 
# 
# - now test for pointer equality until we find a 
# match, or we hit the end of either list 

for (A_iter = A_head, B_iter = B_head + AB_diff; 
     (A_iter != B_iter) || (A_iter->nextNode != NULL); 
     ++A_iter, ++B_iter) { } 

# wherever A_iter and B_iter are now pointing will be 
# either NULL (if they don't intersect) or some non-NULL 
# value representing the intersection node 
+2

嗯,我不认为他要求**如何找到交点...... **。 – 2014-08-29 04:21:34

+1

我知道还有其他方法具有更容易和更简单的逻辑。我没有要求逻辑,我只是​​好奇,如果一个结构可以被修改的全部。现在我知道它不能。谢谢反正。 – avinash 2014-08-29 14:43:05

0

否你不能在定义它之后修改结构。为什么你只想使用数据类型,为什么不使用其他方法?

但是,您可以将链接列表1的每个节点的地址保存在数组中,然后使用它查找交叉点。这接近你想要的。

再次有很多更好的algorthims来找到不需要额外数据类型的交点。

0

如果结构在您的源代码中定义,您可以简单地添加一个额外的成员。如果你必须使用已经在某个库中定义的结构(或者由你的教师)来工作,那么不行,在事实之后你不能添加成员,但是下一个最好的做法是维护一个散列表来映射结构实例的地址到有关该结构的其他信息。在这种情况下,由于您需要的唯一信息是实例是否已被查看,只需将第一个列表的节点地址输入散列表中,然后扫描第二个列表以查看其任何节点是否在散列表中。

另请参阅Alex Reynolds的回答,以避免需要任何其他信息。

相关问题