查看: 5816| 回复: 20
跳转到指定楼层
上一主题 下一主题
收起左侧

判断链表是否有环

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
Check whether the linked list is either NULL-teminated or not. If there is a cycle, find start node of the loop and find the length of the loop.

上一篇:问大家一个问题, find the kth number in two sorted array
下一篇:扔n面dice若干次,求每面都出现的期望次数(题目更新)
全局:
楼主知道答案吗?怎么感觉出了记录所有经过的节点也没什么好方法了。。。
回复

使用道具 举报

🔗
 楼主| lhy1987 2011-11-11 12:15:29 | 只看该作者
全局:
回复 2# 剑魔独孤求败


    那样空间复杂度太高了。。  其实可以用2个指针啊。   就像2个人赛跑,起点一样,如果是跑圈,跑得快的那个人肯定会再次遇到跑得慢的啊。 就利用这个原理
回复

使用道具 举报

🔗
 楼主| lhy1987 2011-11-11 12:23:05 | 只看该作者
全局:
回复 2# 剑魔独孤求败


    代码如下:
  1. typedef struct{
  2.    NODE *start;//start node of the
  3.      int len;//the length of the loop.
  4. }loop; //return this for result

  5. NODE *findstart(NODE *head, NODE *fast){
  6.     if(fast==NULL||head==NULL)   return NULL;
  7.            NODE *start=(NODE *)malloc(sizeof(NODE));
  8.            if(start==NULL)  exit(0);
  9.            start=head;
  10.         while(start!=fast){
  11.            start=start->next;
  12.            fast=fast->next;
  13.            if(fast==NULL) return NULL;
  14.         }

  15.         return fast;

  16. }

  17. int findlen(NODE *start){
  18.     NODE *temp=(NODE *)malloc(sizeof(NODE));
  19.            if(temp==NULL)  exit(0);
  20.            temp=start;
  21.            int len=0;
  22.           while(1){
  23.             start=start->next;
  24.             len++;
  25.             if(start==temp||start==NULL)  break;
  26.            }
  27.            return len;

  28. }


  29. loop *checkCircle(NODE *head){
  30.     if(head==NULL)  return NULL;
  31.             NODE *slow=(NODE *)malloc(sizeof(NODE));
  32.             if(slow==NULL) exit(0);
  33.            NODE *fast=(NODE *)malloc(sizeof(NODE));
  34.            if(fast==NULL) exit(0);
  35.            slow=head;
  36.            fast=head;
  37.            loop *lo=(loop *)malloc(sizeof(loop));
  38.     if(lo==NULL)  exit(0);
  39.            while(fast!=NULL&&fast->next!=NULL){
  40.                fast= fast->next->next;
  41.                slow=slow->next;
  42.                if(fast==slow){
  43.              
  44.                            lo->start=findstart(head,fast);
  45.                                    lo->len=findlen(lo->start);
  46.                                    fast=NULL;
  47.                                    free(fast);
  48.                                    slow=NULL;
  49.                                    free(slow);
  50.                                   return lo;
  51.     }
  52.        
  53.         }
  54.              lo->start=NULL;
  55.              lo->len=0;
  56.              fast=NULL;
  57.             free(fast);
  58.             slow=NULL;
  59.             free(slow);
  60.             return lo;
  61. }
复制代码
回复

使用道具 举报

🔗
wwwyhx 2011-11-11 14:47:18 | 只看该作者
全局:
不就是一个指针走两步, 一个指针走一步, 判断未来相交的可能性.
证明就用相对论来证吧, wa ka ka ....
回复

使用道具 举报

🔗
 楼主| lhy1987 2011-11-12 00:00:27 | 只看该作者
全局:
回复 5# wwwyhx


    版主大人高见! 但是然后还要返回环的起点,这时候需要让一个指针从链表头出发,让另外一个指针从他俩相遇的点出发,2个指针再次相遇的点就是起点。
回复

使用道具 举报

🔗
nooneknow 2011-11-14 04:13:05 | 只看该作者
全局:
回复 1# lhy1987


google
Floyd's cycle-finding algorithm

链表检测cycle的经典算法。每个码工必须知道的吧。哈哈。。。
回复

使用道具 举报

🔗
bosshugoboss 2011-12-17 07:34:42 | 只看该作者
全局:
一个指针每次两步 一个每次一步 check最后是否相遇
相当经典的一道算法题~
回复

使用道具 举报

🔗
3vilCoder 2012-2-10 10:12:57 | 只看该作者
全局:
这题貌似还有一种算法,reverse整个linked list,看是否会会回到起点
回复

使用道具 举报

🔗
farayaw 2012-2-14 02:33:40 | 只看该作者

判断链表是否有环

全局:



- 發送自我的 iPhone 大板凳應用

评分

参与人数 5大米 +75 收起 理由
Aliced3645 + 10 NB!!
secretgu + 20 赞原创~
秋水长天 + 15 我去
kamia + 21 原创内容
xiayuan0623 + 9 赞

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表