免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7772 | 回复: 19
打印 上一主题 下一主题

有什么简单的办法检查单链表里是否有环? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-21 10:10 |只看该作者 |倒序浏览
如给定:
typedef struct node {
    char ch;
    struct node *next;
}node_t;

int isCircle( node_t *head);

以这两个条件如何确定单链表里有环存在?

论坛徽章:
0
2 [报告]
发表于 2007-05-21 10:26 |只看该作者
int isCircle( node_t *head)
{
        node_t *pTmpNode;
       
        pTmpNode = head;
       
        while (pTmpNode != head)
        {
                pTmpNode = pTmpNode->next;
                if (pTmpNode == NULL)
                {
                        return false;
                }
        }
        return true;
}

这样应该可以

论坛徽章:
0
3 [报告]
发表于 2007-05-21 10:42 |只看该作者
楼上的不对, 楼主请查找以前的帖子

论坛徽章:
0
4 [报告]
发表于 2007-05-21 10:43 |只看该作者
问题是这个环可能是由结尾指针指向前边的任意元素,不一定指回头节点?
如:
head-->##-->##-->##-->##-->##--
                        ^                                 |
                         |                                 |
                          ---------------------------
(画得难看,见笑!)
可能我没说清楚,
正常的单链表一般应该是head->##->........->##->NULL,
假如出现异常操作,使得尾指针不是指向NULL,而是指向前面某个元素(不一定指回头节点),
这时假如需要一个接口去判断这个单链表是否是正常链表,这个接口用什么办法(或算法)实现!

论坛徽章:
0
5 [报告]
发表于 2007-05-21 10:48 |只看该作者
  1. int isCircle( node_t *head)
  2. {
  3.         node_t *q,* p = head;
  4.         while (p) {
  5.                 q = p->next;
  6.                 while (q) {
  7.                         if (p == q) return 1;
  8.                         q = q->next;
  9.                 }
  10.                 p = p->next;
  11.         }
  12.         return 0;
  13. }
复制代码


怎麼也得兩個循環吧?

论坛徽章:
0
6 [报告]
发表于 2007-05-21 10:59 |只看该作者
So sorry! I'm wrong

论坛徽章:
0
7 [报告]
发表于 2007-05-21 11:06 |只看该作者

回复 5楼 福瑞哈哥 的帖子

如果有回环,第二个循环是否有死循环的可能?
如:
head->#->#->#->#->#->#->#->
                             ^                    |
                              |                    |
                               -----------------
这种情况可否正常工作?

论坛徽章:
0
8 [报告]
发表于 2007-05-21 11:08 |只看该作者
原帖由 mhello 于 2007-5-21 11:06 发表
如果有回环,第二个循环是否有死循环的可能?
如:
head->#->#->#->#->#->#->#->
                             ^                    |
                              |           ...



shit,入了陷阱!

论坛徽章:
0
9 [报告]
发表于 2007-05-21 11:29 |只看该作者

回复 4楼 mhello 的帖子

各位大侠,有什么方法可以解决这个问题(先不考虑解决方法的效率问题)?

论坛徽章:
0
10 [报告]
发表于 2007-05-21 11:37 |只看该作者
这样可以吗

int isCircle(node_t *head)
{
     node_t *  p=&head;
     node_t *  q=&head;
     while(p->next != NULL && q->next->next!= NULL)
     {
          p=p->next;
          q=q->next->next;

           if(p->ch ==  q->ch)
          return 1;

     }

      return 0;
}



}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP