前面討論了線性表的順序存儲方式(順序表)和鏈式存儲方式(線性鏈表),這兩節討論線性表的另外一種形式的鏈式存儲結構:循環鏈表。算法
循環鏈表指的是鏈表的最後一個鏈結點的指針域指向鏈表的第一個結點。有時候爲了方便,咱們在鏈表的第一個結點前設置一個特殊結點,稱之爲 頭結點。因而循環鏈表的最後一個結點的指針域指向的是頭結點。spa
顧名思義,雙向鏈表指在鏈表的每個結點中除了數據域以外,設置兩個指針域,一個指向直接前驅結點,一個指向直接後繼結點。3d
雙向鏈表能夠是循環的,也能夠不是循環的,根據須要也能夠選擇設置頭結點。指針
設置兩個指針進行賽跑是解決關於循環鏈表的經典算法。簡單來講,首先在頭結點處設置快慢指針,二者同時向後移動,快指針一次移動兩步,慢指針一次移動一步,若是鏈表是帶環的,那麼快指針必定會追上慢指針。cdn
bool hasCycle(struct ListNode *head) {
struct ListNode *right = head;
struct ListNode *left = head;
while (right != NULL && right -> next != NULL && right -> next -> next != NULL) {
right = right -> next -> next;
left = left -> next;
if (left == right) {
return 1;
}
}
return 0;
}
複製代碼