環形鍊錶 鍊錶

2022-06-02 22:57:10 字數 1783 閱讀 5697

題目

給定乙個鍊錶,判斷鍊錶中是否有環。

為了表示給定鍊錶中的環,我們使用整數pos來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果pos-1,則在該鍊錶中沒有環。

示例 1:

輸入:head = [3,2,0,-4], pos = 1

輸出

true

解釋:鍊錶中有乙個環,其尾部連線到第二個節點。

示例 2:

輸入:head = [1,2], pos = 0

輸出

true

解釋:鍊錶中有乙個環,其尾部連線到第乙個節點。

示例 3:

輸入:head = [1], pos = -1

輸出

false

解釋:鍊錶中沒有環。

思想 我們可以通過檢查乙個結點此前是否被訪問過來判斷鍊錶是否為環形鍊錶。常用的方法是使用雜湊表。

我們遍歷所有結點並在雜湊表中儲存每個結點的引用(或記憶體位址)。如果當前結點為空結點 null(即已檢測到鍊錶尾部的下乙個結點),那麼我們已經遍歷完整個鍊錶,並且該鍊錶不是環形鍊錶。如果當前結點的引用已經存在於雜湊表中,那麼返回 true(即該鍊錶為環形鍊錶)。

**

public

boolean hascycle(listnode head)

else

head =head.next;

}return

false

;}

換種思路通過使用具有 不同速度 的快、慢兩個指標遍歷鍊錶,空間複雜度可以被降低至 o(1)o(1)。慢指標每次移動一步,而快指標每次移動兩步。

如果列表中不存在環,最終快指標將會最先到達尾部,此時我們可以返回false

現在考慮乙個環形鍊錶,把慢指標和快指標想象成兩個在環形賽道上跑步的運動員(分別稱之為慢跑者與快跑者)。而快跑者最終一定會追上慢跑者。這是為什麼呢?考慮下面這種情況(記作情況 a)- 假如快跑者只落後慢跑者一步,在下一次迭代中,它們就會分別跑了一步或兩步並相遇。

其他情況又會怎樣呢?例如,我們沒有考慮快跑者在慢跑者之後兩步或三步的情況。但其實不難想到,因為在下一次或者下下次迭代後,又會變成上面提到的情況 a。

**

public

boolean hascycle(listnode head)

listnode slow =head;

listnode fast =head.next;

while (slow !=fast)

slow =slow.next;

fast =fast.next.next;

}return

true

;}

鍊錶 環形鍊錶

環形鍊錶也叫迴圈鍊錶 可以是雙鏈表 也可以是單鏈表 操作原理和單鏈表差不多,只是最後乙個節點不在指向空 null 而是頭 head 這裡以單鏈表舉例 description 環形鍊錶 author lzq date 2018 11 3 20 46 version 1.0 public class a...

鍊錶 環形鍊錶

題目描述 給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回 null。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。注意,pos 僅僅是用於標識環的情況,並不會作為引數傳遞到函式中。說明 不允...

鍊錶 環形鍊錶 II

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回null。說明 不允許修改給定的鍊錶。高階 你是否可以不用額外空間解決此題?definition for singly linked list.class listnode public class solution start p1 ...