給定乙個鍊錶,判斷鍊錶中是否有環。
高階:
你能否不使用額外空間解決此題?
節點類:
class listnode
}
(1)使用額外空間來判斷鍊錶中是否有環
思路:遍歷整個鍊錶,將每一次遍歷的節點存入set中,利用set存入相同元素返回false的特性,判斷鍊錶中是否有環。
public boolean hascycle(listnode head)
head = head.next;
}return false;
}
由於遍歷,導致時間複雜度為o(n),由於使用了set集合,空間複雜度為o(n)。
(2)使用快慢指標。
思路:快慢指標都從頭節點開始,快指標一次走兩步,慢指標一次,如果慢指標能夠追趕上快指標,則證明鍊錶中有環。
public boolean hascylce2(listnode head)
}return false;
}
如果鍊錶有環,找出環的入口節點。
思路:快慢指標的相遇點到環入口的距離等於頭節點到環入口的距離,那麼在頭節點和相遇點各設乙個相同步伐的指標,他們相遇的那個節點就是環入口。
public listnode getentrance(listnode head)
}if (iscycle)
return slow;
}return null;
}
若煉表有環,求出環的長度。
思路:若煉表有環,得到環入口,然後讓指標指向環入口,指標遍歷完重新回到環入口的路程即環的長度。
public int getcylcelength(listnode head) }}
return length;
}
leetcode 141 142環形鍊錶
給定乙個鍊錶,判斷鍊錶中是否有環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。示例 1 輸入 head 3,2,0,4 pos 1 輸出 true 解釋 鍊錶中有乙個環,其尾部連線到第二個節點。雙指標法 兩...
鍊錶中是否有環141 142
判斷鍊錶中是否有環 設定兩個指標,乙個快乙個慢 每次慢的走一步,快的走兩步,如果相遇就說明有環 public boolean hascycle listnode head else return false return false 和上面的區別是如果有環,要返回環的入口結點,如果沒環就返回空 先假...
Leetcode 判斷有環鏈表的環長度 2
思路 當兩個指標相遇,證明鍊錶有環的時候,讓兩個指標從相遇點繼續迴圈前進,並統計前進的迴圈次數,直到兩個指標第2次相遇,此時,統計出來的前進次數就是環數。思考一下 假設兩指標分為為p1,p2,則指標p2每次比p1多走一步,兩者的速度差為1步,當兩個指標再次相遇,p2比p1多走了1圈,因此 環長 每一...