2017-08-10 41 views
1

我目前正在重新學習一些以前在數據結構方面的知識,並決定處理諸如HackerRank等問題。我遇到了一個簡單的問題,我們必須在鏈表中檢測一個循環,但我似乎無法理解我做錯了什麼。我查看了其他答案,並理解了它們的語法和邏輯,但似乎無法找到我的代碼失敗的邏輯。我的代碼錯誤? (在鏈表中循環)

boolean hasCycle(Node head) { 

    if (head == null || head.next == null){ 
     return false; 
    } 

    Node first = head; 
    Node second = head.next; 

    while (second != null){ 
     if (first == second) 
     { 
      return true; 
     } 
     first = first.next; 
     second = second.next.next; 
    } 
    return false; 
} 
+0

您的週期是什麼意思? –

+0

而不是一個循環鏈表,其中最初的「尾」節點指向頭部,我正在檢查完整的鏈表以查看它是否是循環的。如果它有循環,它可以是一個節點指向另一個先前節點的地方。繼承人問題:https://www.hackerrank.com/challenges/ctci-linked-list-cycle –

+0

該程序足夠小,您可以在調試器中逐行執行它。 –

回答

0

據我瞭解,您的列表可以在任何節點中有一個圓,而不僅僅是第一個。你的代碼遠不是解決方案。 您可以簡化對問題的看法,因爲必須檢查節點是否被多次訪問。 要做到這一點,你可以使用一個輔助功能,這樣

boolean visitedMoreThanOnce(Node head) 
{ 
    if (head.next == null){ 
     return false; 
    } 


    Node second = head.next; 

    while (second != null){ 
     if (head == second) 
     { 
      return true; 
     } 
     second = second.next; 
    } 
    return false; 
} 

那麼你的功能可能是

boolean hasCycle(Node head) { 

Node first = head; 
while (first != null){ 
    if (visitedMoreThanOnce(first)) 
    { 
     return true; 
    } 
    first = first.next; 
} 
return false; 
} 

請注意,我用你的函數簽名解決它。通過查看問題中的評論中提供的鏈接中的問題,它會將該頭指向一個指針。在這種情況下,您將需要使用->運營商,而不是.

+0

我認爲這將被稱爲hackerrank作弊,因爲如果你可以使用助手,爲什麼不使用助手hasCycle(頭)? :D - 該列表的最大長度爲100,如https://www.hackerrank.com/challenges/ctci-linked-list-cycle –

+0

中所述。我爲幫助程序編寫了代碼。我不知道hackerrank規則,但他可以將代碼放在while循環中的幫助函數中。這是一回事。我做到這一點的方式更具可讀性。 –

+0

啊,好的。 =) - 你想對列表最大大小爲100做些什麼? –