2014-08-29 80 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的回答,以避免需要任何其他信息。

相關問題