Algorithm One Day One -- 判断链表是否有环(上)



Is a loop ? Question descrip as follows :

Assume that wehave a head pointer to a link-list. Also assumethat we know the list is single-linked. Can you come up an algorithm to checkwhether this link list includes a loop by using O(n) time and O(1) space wheren
is the length of the list? Furthermore, can you do so with O(n) time and onlyone register?

/********************************************************************
created:2015年1月22日 00:54:56
author: Jackery
purpose: Is there a loop ?
*********************************************************************/
#include"stdafx.h"
#include<iostream>
using namespace std;

typedef struct node
{
	int data;
	 struct node *next;
}Node,*pNode;

Node *Create(int *numNode)
{
	//创建一个链表
	Node *head,*tail,*cnew;
	head=NULL;
	int num;
	cout <<"输入数据(以#键结束):" << endl;
	while(1 )
	{
	cin >>num ;
	if('#'==getchar())
	//以#键表示输入结束
	break;
	cnew=new  Node;;
	cnew->data=num;
	cnew->next=NULL;
	if(head==NULL)
		//若为空则将头节点指向新节点
		head=cnew;
	else
	   tail->next=cnew;
	//将当前节点的next指向新的节点
	tail=cnew;
   (*numNode)++;
	}
	return head;}

/*判断是否有环思路概述:分别定义步长为1和2的指针fast and slow
指向头结点,if无环,则fast先走到终点;如果链表长度为奇数时,
fast->Next为空;当链表长度为偶数时,fast为空*/

bool isLoop(pNode  pHead)
{
	pNode fast = pHead;
	pNode slow = pHead;
	while( fast != NULL && fast->next != NULL)
	{
		fast = fast->next->next;
		slow = slow->next;
		//如果有环,则fast会超过slow一圈
		if(fast == slow)
		{
			break;
		}
	}

	if(fast == NULL || fast->next == NULL  )
	{
		cout <<"Wow,there is not loop in the list "<< endl;
		return false;
	}
	else
	{
		cout <<"Yeah,there is loop in the list " << endl;
		return true;
	}
}
int main(int argc ,char * argv[])
{
	int numnode=0;
	//初始化将节点个数初始化为零
   pNode head=NULL ;
   	cout <<"链表head的节点个数为: "  <<endl;
   cin >>numnode;
	head=Create(&numnode);
    isLoop(head);
	return 0;
}
时间: 2024-11-09 17:14:34

Algorithm One Day One -- 判断链表是否有环(上)的相关文章

链表(13)----判断链表是否有环,并返回环入口节点

1.链表定义 typedef struct ListElement_t_ { void *data; struct ListElement_t_ *next; } ListElement_t; typedef struct List_t_{ int size; int capacity; ListElement_t *head; ListElement_t *tail; } List_t; 2.判断链表是否有环,并返回链表入口节点 (1)方法一:根据相遇节点.头结点.入口节点之间的距离关系求解

判断链表是否有环

Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using extra space? 关键点:1)判断链表是否有环. 2)一个小坑在判断root和root的next是否为空上. 3)可以看为追及问题.最关键的坑在判断快走(每次走2步的节点),走1步会不会已经走到头... /** * Definition for singly-linked list. * str

判断链表是否有环及环入口点的求法(Linked List Cycle II )

分为两步 第一步 还是利用快慢指针,如果有环的话在利用快慢指针终会相会于一个节点. 第二步.然后从这节点出发每次出发走一步,同时从根节点出发每次出发也走一步则他们两个指针相遇的地方就是环的入口. 第一步好解释那么第二步是为什么呢? 网上有很多解法大都是从数学的角度来分析,有公式也有推算很不直观,我从图形的角度来看的话就相对理解起来简单很多. 将图摊开成一条线,假设我们有环而且假设快指针就多走了一圈就与慢指针相遇了(多走n圈其实也是一样的,画出图来也不难理解,只是画起来麻烦索性就以一圈来代表) 红

判断链表是否带环,若带环,找到环的入口点

#pragma once #include<iostream> using namespace std; template<class T> struct LinkNode { T _data; LinkNode* _next; LinkNode(const T& x) :_data(x) , _next(NULL) {} }; template<class T> class ListNode { //为了安全性 private: ListNode(const 

C语言强化(七)链表相交问题_3 判断链表是否带环

前两篇讨论的前提都是链表是无环的,但是如果链表有环呢? 显然,如果链表有环,那么之前的寻找链表尾结点的函数将陷入死循环,之前的算法也将崩掉. 所以对于链表相交的问题,首先要判断的是链表是否有环. 题目 给出俩个单向链表的头指针,比如 h1,h2,判断这俩个链表是否相交 解题步骤 判断两个[无环]链表是否相交 找到两个[无环]链表的相交结点 判断链表是否带环 判断两个[有环]链表是否相交 找到两个[有环]链表的相交结点 思路 用两个指针,一个指针步长为1,一个指针步长为2,若最后相遇,则链表有环

判断链表是否有环及入口点

判断链表是否有环方法--快慢指针 一. 问:如何判断是否有环? 答:如果有两个头结点指针,一个走的快,一个走的慢,那么若干步以后,快的指针总会超过慢的指针一圈. 设置两个指针(fast,slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定相遇.(当然,fast先行头到尾部为NULL,则为无环链表). #include <stdio.h> typedef struct ListNode { int val

判断链表是否有环及两链表是否相交

单向链表是最常用的数据结构之一,因此总结其常见的问题及其解决方案是很有意义的. 问题1:如何判断一个单向链表是否有环?如果有,如何找到其入口节点的指针? 算法思想:用两个指针p1,p2同时指向链表的头部,p1一次移动一步,p2一次移动两步,如果最终p1和p2重合则说明链表有环,如果p2走到空指针(链表的结尾)则说明链表无环: 如果最终p1和p2重合,使p2重新指向链表的头结点,然后p1和p2同时一次移动一步,当p1和p2再次重合时该节点指针就是环的入口节点指针. 算法实现: [cpp] view

判断链表是否带环,以及环的入口

给出一个链表,先判断链表是否带环,如果带环,求出环的入口. 判断是否带环:用快慢指针.快指针每走两步,慢指针走一步,如果两者在某个点处相 遇,则链表带环. 下边给出函数的实现代码: typedef struct LinkNode { DataType data; struct LinkNode *next; }LinkNode,*pLinkNode; typedef struct LinkList { LinkNode *pHead; }LinkList,*pLinkList; pLinkNod

Floyd判圈算法(判断链表是否含环)

Floyd判圈算法 简介 Floyd判圈算法,也称龟兔赛跑算法,可用于判断链表.迭代函数.有限状态机是否有环.如果有,找出环的起点和大小.时间复杂度O(n),空间复杂度O(1). 可以先思考一下,假设有一个圆形的跑道周长为\(C\),A和B从同一个起点,分别以\(v\)和\(2v\)的速度同向出发,可以知道,因为B比A跑得快而且跑道是环形的,所以接下来一定存在某一时刻,B和A相遇,这时候,B跑过的总距离\(S_B\)减去A跑的总距离\(S_A\)一定是\(C\)的整数倍.即: \(S_B-S_A