数据结构——判断单链表是否有环

来源:互联网 发布:mysql数据库删除主键 编辑:程序博客网 时间:2024/06/06 06:39
#include <stdio.h>#include <malloc.h>#include <stdlib.h>#define INSERT_NUM 100#define FAST_POINT_STEP 2typedef int ElemType;typedef struct LNode{    ElemType data;    struct LNode *next;}LinkList, *pNode;//init the linklistvoid initList(pNode *head){    (*head) = (LinkList*)malloc(sizeof(LinkList));    (*head)->next = NULL;    (*head)->data = 9;}//insert Elementint insertElem(pNode head, ElemType data){    pNode pInsertNode;    pNode pWork;     pWork = head;    pInsertNode = (LinkList*)malloc(sizeof(LinkList));    //memset(pInsertNode, 0, sizeof(LinkList));    if(pInsertNode == NULL){        return 0;    }    pInsertNode->next = NULL;    pInsertNode->data = data;    while(pWork->next != NULL){        pWork = pWork->next;    }    pWork->next = pInsertNode;    return 1;}//print node data one by onevoid printList(pNode head){    printf("in the function printList\n");    if(head == NULL){        printf("List is empty----\n");    }    pNode p = head->next;    do{        printf("%d", p->data);        printf("--->");        p = p->next;    }while(p != NULL);    }//make the LinkList loopvoid makeLoop(pNode head){    pNode p = head;    while(p->next != NULL ){        p = p->next;    }    p->next = head->next;}//tell if is a loop list?int isListLoop(pNode head){    int i;    pNode slow = head;    pNode fast = head;    while(fast){        for(i = 0 ; i < FAST_POINT_STEP ; i++){            fast = fast->next;            if(fast == slow)                return 1;            else if(fast == NULL)                return 0;        }        slow = slow->next;    }    return 0;}void main(){    int i;    pNode head;    initList(&head);        for(i = 0 ; i < INSERT_NUM ; i++){        insertElem(head, i);    }    makeLoop(head);    //printList(head);    if(isListLoop(head))        printf("is a loop list \n");    else        printf("is not a loop list\n");}

        之前在网上看到有人说,判断一个链表是否有环,还可以使用两个for循环嵌套的方法,当外层循环步进一个节点时,内层循环就遍历外层循环节点之后的所有节点,然后比较内外循环的两个节点。若有节点地址相等,则表明该单链表有循环,反之则不存在循环。这种方法无疑效率比较低。而且如果出现下面这种情况的话,会更加麻烦。



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 牛难产拉不出来怎么办 老公发现老婆有外遇怎么办 睡眠不好半夜老是醒怎么办 拔完智齿肿了怎么办 拔牙后咽口水疼怎么办 吃了脏东西拉肚子怎么办 微信遇到仙人跳怎么办 牙有裂痕疼应该怎么办 胸罩在学校掉了怎么办 锁屏密码忘记了怎么办 中汇支付不到账怎么办 痘痘毁容烂脸怎么办 我的手机掉了怎么办 公司不给开工资怎么办 我有卵巢老化怎么办呢 老师骂了我,我该怎么办 我的牙齿很难看怎么办 门牙摔了个缺怎么办 鱼身上鱼鳞烂了怎么办 鱼身上发白烂了怎么办 养的鱼身上烂了怎么办 婴儿被蚊虫咬了怎么办 在野外被蚂蚁咬怎么办 娱乐之太帅了怎么办 鞋舌头歪没有孔怎么办 万一吃了母猪肉怎么办 我的手机丢了怎么办 欠了赌债还不起怎么办 车库门前被堵了怎么办 别人车停我车位怎么办 怎么办能防止锁眼被堵 别人堵着我车了怎么办 马桶被排骨堵了怎么办 马桶被刷子堵了怎么办 屎太大马桶堵了怎么办 大便硬马桶堵了怎么办 马桶让大便堵了怎么办 出了月子奶水少怎么办 木瓜没熟切开了怎么办 小孩被蚊虫叮咬红肿怎么办 下巴歪导致脸歪怎么办