判断单向链表是否有环

1.设立2个指针i,j指向头结点

2.i走1步,j走2步.如果有环,j一定能追上i;

3.如果j不为空,且i和j相等此链表即为有环。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 typedef struct student                                              //定义链表结构
 5 {
 6     int num;
 7     struct student *pnext;
 8 }stu,*pstu;
 9 void link_tail_insert(pstu *phead,pstu *ptail,int i);
10 void link_show(pstu );
11 void link_judge_loop(pstu phead);
12 void main(){
13     pstu phead,ptail;
14     int i;
15     phead = NULL;
16     ptail = NULL;
17     while(scanf("%d",&i) != EOF){
18         link_tail_insert(&phead,&ptail,i);
19     }
20     link_show(phead);
21     ptail->pnext = phead;                                          //单链表建立环
22     link_judge_loop(phead);
23     system("pause");
24
25 }
26 void link_tail_insert(pstu *phead,pstu *ptail,int i){             //尾插法建立链表
27     pstu pnew;
28     pnew = (pstu)malloc(sizeof(stu));
29     memset(pnew,0,sizeof(stu));
30     pnew->num = i;
31     if(*ptail == NULL){
32         *phead = pnew;
33         *ptail = pnew;
34     }
35     else{
36         (*ptail)->pnext = pnew;
37         *ptail = pnew;
38     }
39 }
40 void link_show(pstu phead){                                       //输出链表
41     pstu pshow;
42     pshow = phead;
43     if(phead == NULL)
44     {
45         printf("no exsit\n");
46         return;
47     }
48     while(pshow != NULL){
49         printf("%d ",pshow->num);
50         pshow = pshow->pnext;
51     }
52     putchar(‘\n‘);
53 }
54 void link_judge_loop(pstu phead){                               //判断是否有环
55     pstu i,j;
56     i = j = phead;
57     while(j != NULL){
58         i = i->pnext;
59         j = j->pnext;
60         if(j == NULL)                                           //j要分步走,判断是否为空,是空则结束循环
61             break;
62         j = j->pnext;
63         if(i == j)                                               //i和j相等,有环
64             break;
65     }
66     if(j != NULL && i == j)
67         printf("link has loop\n");
68     else
69         printf("link has no  loop\n");
70 }  
时间: 2024-10-06 17:12:05

判断单向链表是否有环的相关文章

判断单向链表是否有环,环起点,环长,链表长

今天在微信上看到一篇介绍如何判断单向链表是否有环的文章,感觉很有意思,整理一下读后的思路. 一.判断单向链表是否有环 方法1:设置一个Hashset,顺序读取链表中的节点,判断Hashset中是否有该节点的唯一标识(ID).如果在Hashset中,说明有环:如果不在Hashset中,将节点的ID存入Hashset. 这种方法时间复杂度已经最优,但是因为额外申请了Hashset,所以空间复杂度不算最优. 方法2:设置2个指针,指向头节点.第1个指针每次指向下一个节点:第2个指针指向下一个节点的下一

笔试算法题(27):判断单向链表是否有环并找出环入口节点 &amp; 判断两棵二元树是否相等

出题:判断一个单向链表是否有环,如果有环则找到环入口节点: 分析: 第一个问题:使用快慢指针(fast指针一次走两步,slow指针一次走一步,并判断是否到达NULL,如果fast==slow成立,则说明链表有环): 第二个问题:fast与slow相遇时,slow一定还没有走完一圈(反证法可证明):  示意图A为起始点,B为环入口点,C为相遇点,则a1=|AB|表示起始点到换入口的距离,a2=|CB|表示相遇点到环入口点的距离,s1=|AB|+|BC|表示slow指针走的长度,s2表示fast指针

判断单向链表是否有环,以及环入口与链表头节点的距离

第一步:检测链表是否有环. 方法还是比较多的,这里先讲一个:快慢指针. 快慢指针的方法,就是让两个指针同时指向链表.在向后遍历的时候,一个指针每次走两步,称为快指针:一个指针每次走一步,称为慢指针.如果快慢指针相遇,则说明链表有环,否则无环.(后面证明.) 代码实现如下 // 如果有环,则返回快慢指针相遇点.如果没环,则返回NULL. position IsLoop(list l) { if (l == NULL) { printf("Invalid parameter for function

堆排序的实现(联发科子公司创发科技笔试)及判断单向链表的环

先上代码: #include <iostream> #include <algorithm> using namespace std; void HeapAdjust(int data[],int i,int length) { int nChild; int nTemp; for(nTemp=data[i]; 2*i+1<length ;i=nChild) { nChild=2*i+1; if(nChild<length-1&&data[nChild+

判断单链表是否存在环及寻找环的入口点

一.判断单链表是否存在环 这个问题有很多方法,最容易想到的就是记录每个节点记录的次数.这里也介绍的是另一种简单而常见的方法 快慢指针法: 定义两个指针slow, fast.slow指针一次走1个结点,fast指针一次走2个结点.如果链表中有环,那么慢指针一定会再某一个时刻追上快指针(slow == fast).如果没有环,则快指针会第一个走到NULL 1 int has_cycle(node *head) { 2 if (head == NULL) return false; 3 node* f

如何判断单链表是否存在环

原文:http://blog.csdn.net/liuxialong/article/details/6555850 如何判断单链表是否存在环 给定一个单链表,只给出头指针h: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针slow.fast,从头指针开始,每次分别前进1步.2步.如存在环,则两者相遇:如不存在环,fast遇到NULL退出. 2.对于问题2,记录下问题1的碰撞点p,

11.判断单链表是否有环

判断单链表是否有环:   这里也是用到两个指针,如果一个链表有环,那么用一个指针去遍历,是永远走不到头的.   因此,我们用两个指针去遍历:first指针每次走一步,second指针每次走两步,如果first指针和second指针相遇,说明有环.时间复杂度为O (n). 方法 // 方法:检测单链表是否有环 public boolean hasCycle(Node head) { if (head == null) { return false; } Node first = head; Nod

判断单链表是否有环及寻找环的入口

一.判断单链表是否有环 1.遍历链表 遍历链表,将已经访问过的结点,设置为已访问,如果访问同一结点两次,则说明有环,时间O(n),空间O(n). 2.链表反转 遍历链表,将访问的结点指针反向.如果存在环,反转后next指向原链表头,但链表反转会破坏链表的结构,反转需要注意缓存当前结点的下一结点,时间O(n),空间(1). 3.快慢指针 设置快慢两个指针fast和slow,两个指针都链表头开始,fast每次移动2步,slow为1步.如果存在环,则fast先进入环,slow后进入环,最后两者在环中相

判断单链表是否有环相关问题(转载加总结)

给定一个单链表,只给出头指针h: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针slow.fast,从头指针开始,每次分别前进1步.2步.如存在环,则两者相遇:如不存在环,fast遇到NULL退出. 2.对于问题2,记录下问题1的碰撞点p,slow.fast从该点开始,再次碰撞所走过的操作数就是环的长度s. 3.问题3:有定理:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分