在這個程序中,我們將得到一個可能包含循環的鏈表,我們必須找出循環是否存在,然后循環的大小是多少。讓我們使用一個非常著名的方法來借助代碼來查找循環的長度,并討論其時間和空間復雜度。
問題簡介
在這個問題中,正如我們上面所看到的,我們給出了一個鏈表,其中可能包含也可能不包含循環,如果循環存在,我們必須找到循環的長度,否則我們必須返回零,因為有不存在循環。我們將使用 Floyd 循環方法來查找循環,然后檢查其大小。例如,如果我們給出一個鏈表 –
List: 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8
登錄后復制
從包含 8 的節點到包含 4 的節點存在一個循環,這意味著 8 與 4 連接,形成長度為 5 的循環,我們必須檢測它。
方法
在本題中,我們將使用Floyd循環方法來檢測循環,然后我們將使用長度查找的概念來查找循環的長度。讓我們首先看看問題的基本步驟,然后我們將轉向弗洛伊德方法和長度方法。
首先,我們將創建一個類來提供鏈表節點的基本結構,并在其中定義構造函數來初始化節點值。
然后我們創建了一個函數來將元素推送到給定的鏈表中。
我們使用上面的方法創建了一個鏈表,然后將最后一個節點鏈接到另一個節點以在其中形成一個循環。
弗洛伊德算法
在這個算法中,我們遍歷鏈表,一旦進入鏈表,就不能從任何節點出去。這意味著,如果我們在鏈表循環部分有兩個指針,其中一個指針一次移動一個節點,另一個指針一次移動兩個節點,它們將在某一點相遇。
實現算法后,我們將調用該函數并檢查循環是否存在
如果存在循環,我們將調用 anther 函數來查找循環的長度。
另一方面,我們將返回并打印不存在循環。
示例
在下面的示例中,我們定義一個鏈表并向其中添加 8 個節點。我們通過將節點 8 連接到節點 4 來形成鏈表中的循環。因此,它形成了五個節點的循環。
// class to provide the structure to the linked list node class Node{ constructor(data) { this.value = data this.next = null; } } // function to add values in a linked list function push(data, head) { var new_node = new Node(data); if(head == null) { head = new_node; return head; } var temp = head while(temp.next != null) { temp = temp.next; } temp.next = new_node; return head; } // function to find the length in the loop function length(loop_node) { var count = 1; var temp = loop_node; while(temp.next != loop_node) { count++; temp = temp.next; } console.log("The length of the loop in the given linked list is: " + count); } // function to find the cycle in the given list // if the cycle is found then call the length function function find_node(head) { var slow_ptr = head; var fast_ptr = head; while(slow_ptr != null && fast_ptr != null && fast_ptr.next != null) { slow_ptr = slow_ptr.next; fast_ptr = fast_ptr.next.next; if(slow_ptr == fast_ptr) { length(slow_ptr); return; } } console.log("There is no loop present in the given linked list"); } var head = null; head = push(1,head) head = push(2,head) head = push(3,head) head = push(4,head) head = push(5,head) head = push(6,head) head = push(7,head) head = push(8,head) // making loop in a linked list by connecting 8 to four var temp = head; while(temp.value != 4){ temp = temp.next; } var temp2 = head; while(temp2.next != null){ temp2 = temp2.next } temp2.next = temp // finding the length of the loop find_node(head)
登錄后復制
時間和空間復雜度
在上面的代碼中,我們只遍歷了完整的鏈表一次,循環部分最多遍歷了三次,這使得時間復雜度是線性的。因此上述代碼的時間復雜度是線性的,即 O(N),其中 N 是鏈表的大小。
由于我們沒有使用任何額外的空間,使得程序的時間復雜度為 O(1)。
結論
在本教程中,我們學習了如何通過在 JavaScript 語言中實現概念來查找鏈表中存在的循環的長度。我們使用了 Floyd 的循環查找算法來查找給定鏈表中的循環,然后我們使用 while 循環來遍歷循環并找到其長度。上述代碼的時間復雜度為O(N),空間復雜度為O(1)。
以上就是用于查找鏈表中循環長度的 JavaScript 程序的詳細內容,更多請關注www.92cms.cn其它相關文章!