前面讨论了线性表的顺序存储方式(顺序表)和链式存储方式(线性链表),这两节讨论线性表的另外一种形式的链式存储结构:循环链表。算法
循环链表指的是链表的最后一个链结点的指针域指向链表的第一个结点。有时候为了方便,咱们在链表的第一个结点前设置一个特殊结点,称之为 头结点。因而循环链表的最后一个结点的指针域指向的是头结点。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;
}
复制代码