`

判断单链表是否有环

 
阅读更多

算法思路: 指针p1和p2的起始值均为链表的表头,指针p1每次走一步,指针p2每次走两步。如果链表存在环,则当p1和p2都进入环时,p2会“追上”p1,因为每次行走,p2和p1的距离都缩短了1.

 

//visual studio 2012 下编译通过
#include <stdio.h>
struct node{
	int val;
	node* next; 
	node(int val, node* next){
		this->val = val;
		this->next = next;
	}
};
/*
 * @brief 判断以head节点开头的单链表是否存在环, 时间复杂度是O(n),空间复杂度是O(1)
 * @param node* head 链表的起始节点
 */
bool hasCircle(node* head){
	node *p1, *p2;
	p1 = p2 = head;
	while(true){
		if(p1 == NULL || p2 == NULL) return false; 
		p1 = p1->next; 
		p2 = p2->next; 
		if(p2 == NULL) return false; 
		p2 = p2->next; 
		if(p1 == p2) return true; 
	}
	return true; 
}


int main(){
	//输入和输出重定向
	freopen("in.txt","r", stdin);
	freopen("out.txt", "w", stdout);
	node *p1 = new node(1, NULL),
		 *p2 = new node(2, NULL),
		 *p3 = new node(3, NULL),
		 *p4 = new node(4, NULL);
	/*
	 *case one 
	 */
	p1->next = p2; 
	p2->next = p3; 
	p3->next = p4; 
	p4->next = p2;
	if(hasCircle(p1)){
		fprintf(stdout, "result of case one is yes \n");
	}else{
		fprintf(stdout, "result of case one is no \n");
	}
	
	/*
	 *case two 
	 */
	p1->next = p2; 
	p2->next = p3; 
	p3->next = p4; 
	p4->next = NULL;
	if(hasCircle(p1)){
		fprintf(stdout, "result of case two is yes \n");
	}else{
		fprintf(stdout, "result of case two is no \n");
	}

	/*
	 *case three 
	 */
	p1->next = p2; 
	p2->next = p3; 
	p3->next = p4; 
	p4->next = p1;
	if(hasCircle(p1)){
		fprintf(stdout, "result of case three is yes \n");
	}else{
		fprintf(stdout, "result of case three is no \n");
	}

}
 
分享到:
评论

相关推荐

    判断单链表中是否存在环

    在IT领域,尤其是在数据结构与算法的学习和面试中,判断单链表中是否存在环是一个非常典型且重要的问题。这个问题不仅考验了对链表这一数据结构的理解,还涉及到算法设计、循环检测等关键概念。 ### 题目背景 在...

    快慢指针法判断单链表有环

    在Java中,判断单链表是否有环的经典方法是使用Floyd的“龟兔赛跑”算法,也称为快慢指针法。这种方法利用两个指针,一个每次走一步(称为慢指针),另一个每次走两步(称为快指针)。如果链表中存在环,那么快指针...

    单链表 环 入口点 环长

    本文将详细介绍如何判断单链表中是否存在环,以及如何找到环的入口点和环的长度。 首先,我们需要确定单链表是否存在环。这是通过快慢指针法来完成的,该方法也被称为龟兔赛跑算法。其基本思想是设置两个指针,一个...

    双指针法判断链表有环-Java 版

    附件是使用双指针发判断链表有环的代码实现,在Java中,判断单链表是否有环的经典方法是使用Floyd的“龟兔赛跑”算法,也称为快慢指针法。这种方法利用两个指针,一个每次走一步(称为慢指针),另一个每次走两步...

    单链表的合并(递归-非递归)以及将单链表逆序

    判断单链表是否有环可以使用 Floyd 的环检测算法,具体实现步骤如下: 1. 设定两个指针 p1 和 p2,分别指向链表的头节点。 2. 对链表进行遍历,p1 向前走一步,p2 向前走两步。 3. 如果 p2 碰到 NULL 指针或者两个...

    C语言链表在笔试常考题.docx

    判断单链表是否有环是指检测链表中是否存在环的操作。例如,链表1-&gt;2-&gt;3-&gt;4-&gt;5-&gt;3是一个有环的链表,因为链表中存在环。 解决方案: ```c bool IsExitsLoop(NodeList head){ NodeList slow=head,fast=head; ...

    单链表实现约瑟夫环,希望有帮助

    ### 单链表实现约瑟夫环 #### 知识点概述 本文将详细介绍如何使用单链表来实现约瑟夫环问题,并对该程序进行深入分析。约瑟夫环问题是一个经典的计算机科学问题,通常用来考察数据结构和算法的基础知识。在本程序...

    安卓系统以及进阶教程.zip

    面试基础算法题排序快排堆排归并排序M个元素中查找前N个元素链表判断链是否有效判断单链表是否有环并且找到有环的第一个节点反转发一个链表单链表输出倒数第k个元素二叉树二叉树给出根节点和目标节点,查找从根节点...

    约瑟夫环的单链表实现

    对于寻找单链表环的入口,具体步骤如下: 1. 初始化两个指针,快指针 `fast` 和慢指针 `slow`,都指向链表头。 2. 当 `fast` 不为 null 并且 `fast.next` 也不为 null 时,执行以下操作: - `fast` 移动两步,`slow...

    算法大全-面试题-数据结构.docx

    包括单链表反转、找出单链表的倒数第4个元素、找出单链表的中间元素、删除无头单链表的一个节点、两个不交叉的有序链表的合并、有个二级单链表的转换、一级单链表的交换、判断单链表是否有环、判断两个单链表是否...

    yuesefu.rar_创建一个循环链表_按指定位置删除_循环单链表_约瑟夫环

    本程序的目标是通过循环单链表实现约瑟夫环问题的解决方案,包括创建链表、按指定位置删除节点以及最后打印删除的编号序列。 首先,我们需要了解循环链表。循环链表与普通链表的主要区别在于,它的最后一个节点指针...

    判断链表是否为回文链表leetcode-Algorithms:Coding_Interviews和Leetcode

    判断单链表是否有环 二分搜索 缺失的数字 包含min函数的栈 合并两个递增排序的链表 连续子序列的最大和 替换空格 二维数组中的查找 从尾到头打印链表 重建二叉树(用前序和中序构建) 从上到下打印二叉树(层序遍历) ...

    java实现单链表中是否有环的方法详解

    这篇文章主要探讨的是如何判断一个单链表中是否存在环,这是一个重要的算法问题,特别是在数据结构和算法的学习中。 首先,我们需要了解问题的核心:检查链表中是否存在环。一个简单的算法是使用两个指针,我们称为...

    算法大全-数据结构

    8. **判断单链表是否有环**:使用Floyd判圈算法,即两个指针,一个快指针每次移动两步,一个慢指针每次移动一步,如果存在环,快指针最终会追上慢指针。 9. **找到环的起始点和环的长度**:使用两个指针,一个在环...

    快慢指针证明带环单链表

    该方法的核心思想是利用两个速度不同的指针(通常一个快指针每次移动两个节点,一个慢指针每次移动一个节点)来判断链表中是否存在环。 - **慢指针**(`p1`):每次向前移动一步。 - **快指针**(`p2`):每次向前...

    面试单链表问题总结-反转,逆序输出,判环,求交点

    第三,**判断单链表是否存在环**是数据结构中的一大难点。Floyd判环算法,也称为快慢指针法,是最常用的解决方案。设置两个指针,一个每次移动一步(慢指针),另一个每次移动两步(快指针)。如果链表存在环,快...

    算法大全-面试题-数据结构

    8. **判断单链表是否有环**:Floyd判圈算法(快慢指针)可判断链表是否存在环,若快指针追上慢指针则存在环;若找到环,可进一步找到环的起始点,使用一个额外的指针从头开始移动,当与快指针相遇时,即为环的起始点...

    Java实现单链表以及单链表的操作.zip

    11. **判断单链表是否存在环**: 使用Floyd判环法(也称为龟兔赛跑算法),让两个指针以不同速度移动,如果存在环,它们最终会相遇。 12. **环的长度**: 如果发现链表有环,可以使用快慢指针再次相遇后继续移动...

Global site tag (gtag.js) - Google Analytics