Linked List Cycle

本文介绍了一种使用快慢指针的方法来判断单链表中是否存在循环。通过两个速度不同的指针遍历链表,如果存在循环则快指针最终会追上慢指针;若不存在循环,则快指针会到达链表尾部。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 * Solution.cpp
 *
 *  Created on: 2014年4月9日
 *      Author: William
 */

#include <iostream>
using namespace std;

// Definition for singly-linked list.
struct ListNode {
	int val;
	ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};

class Solution {
public:
	bool hasCycle(ListNode *head) {
		if (head == NULL)
			return false;
		ListNode *fast = head;
		ListNode *slow = NULL;	// See below:
		while (fast != NULL && fast != slow) {
			if (slow == NULL)	// We can use do..while.. to avoid this comparison trick.
				slow = head;
			fast = fast->next;
			if (fast != NULL) {
				fast = fast->next;
				slow = slow->next;
			}
		}
		if (fast == slow)
			return true;
		else
			return false;
	}

// The following function is not usable because it will damage the original linked list.
// It's not a check function!!!!
//	bool hasCycle(ListNode *head) {
//		ListNode *p = head;
//		while (p != NULL) {
//			if (p->next == head)
//				return true;
//			ListNode *q = p;
//			// The order of next two lines is important.
//			p = p->next;
//			q->next = head;
//		}
//		return false;
//	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值