/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool hasCycle(struct ListNode *head) {
struct ListNode* node=head->next;
struct ListNode* last=head;
while(last->next){
last=last->next;
}
int temp=0;
while(node){
if(last->next==node){
temp=1;
return true;
}
else{
node=node->next;
}
}
if(temp==0){
return false;
}
}
供参考:
bool hasCycle(struct ListNode* head) {
struct ListNode* node = head, * last = head;
if (head->next == NULL)
return false;
do {
node = node->next;
last = last->next->next;
} while (last && last->next && node != last);
return node == last;
}
【以下回答由 GPT 生成】
为了优化这段判断链表是否为循环链表的代码,我们可以使用快慢指针的方法。快指针每次移动两步,慢指针每次移动一步,如果链表有环,那么快指针一定会追上慢指针。
以下是优化后的代码实现:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool hasCycle(struct ListNode *head) {
if (head == NULL || head->next == NULL) {
return false;
}
struct ListNode *slow = head;
struct ListNode *fast = head->next;
while (slow != fast) {
if (fast == NULL || fast->next == NULL) {
return false;
}
slow = slow->next;
fast = fast->next->next;
}
return true;
}
在优化后的代码中,我们首先判断链表是否为空或只有一个节点,如果是,则肯定不是循环链表,直接返回false。
我们初始化两个指针,慢指针slow和快指针fast,分别指向链表头部和头部的下一个节点。
然后,我们进入一个循环,条件是慢指针和快指针不相等。循环中,慢指针每次向后移动一步,快指针每次向后移动两步。如果链表有环,快指针一定会追上慢指针,此时我们就可以返回true。
如果循环结束后仍然没有追上,那说明链表没有环,我们返回false。
这样,我们就通过使用快慢指针的方法,对判断链表是否为循环链表的功能进行了优化。
【相关推荐】