题解 | #链表中环的入口结点#C语言 哈希表法

链表中环的入口结点

http://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4

哈希表

#include<stdbool.h>
#define base 769
typedef struct ListNode datatype;
struct hashlist 
{
    datatype key;
    struct hashlist* Next;
};
typedef struct 
{
    struct hashlist* hashtable[base];//定义哈希数组的大小
} MyHashSet;

bool isInHash(struct hashlist* list, struct  ListNode* item) 
{
    struct hashlist* cur=list;//遍历链表
    while (cur != NULL) 
    {
        if (cur->key.next == item) //找节点
        {
            return true;
        }
        cur = cur->Next;
    }
    return false;
}
MyHashSet* myHashSetCreate() 
{
    int i=0;
    MyHashSet* myhashtable= (MyHashSet* )malloc(sizeof(MyHashSet));
    /* 对链表的头结点赋初值 */
    for (i = 0; i < base; i++)
    {
        myhashtable->hashtable[i] = NULL;
    }
    return myhashtable;
}


void HashAdd(MyHashSet* obj, struct  ListNode* item) 
{
    //插入在Head处
    if(isInHash(obj->hashtable[(int)(size_t)item % base],item))
        //如果单纯使用(int)会导致指针位数不够,转换成8字节
    {
        //不用添加了
        return;
    }
    struct hashlist* temp = (struct hashlist*)malloc(sizeof(struct hashlist));
    temp->key.next = item;
    temp->Next = NULL;
    if(obj->hashtable[(int)(size_t)item%base] != NULL)
    {
        //当前头链表不为空,则需要将后续的链表接上
        //需要主要这里表头也代表一个数据的值
        temp->Next = obj->hashtable[(int)(size_t)item%base];
    }
    //修改头链表
    obj->hashtable[(int)(size_t)item%base] =  temp;

}
bool myHashSetContains(MyHashSet* obj, struct  ListNode *item) 
{
    return isInHash(obj->hashtable[(int)(size_t)item%base],item);
}
struct ListNode* EntryNodeOfLoop(struct ListNode* pHead ) {
    // write code here
    struct ListNode* cur = pHead;
    MyHashSet* myhashtable  = myHashSetCreate(); 
    while (cur != NULL) 
    {
        if(myHashSetContains(myhashtable,cur))//判断在不在哈希中
        {
            return cur;
            //cur即当前入环的节点
        }
        else
        {
            HashAdd(myhashtable ,cur);
        }
        cur = cur->next;
    }
    return NULL;
}
全部评论

相关推荐

家人们,我现在真的好纠结。我是26届的,目前还没有实习过。我现在的情况是,想参加秋招,但是感觉自己的简历特别空,没有实习经历会不会秋招直接凉凉啊?可我又听说现在很多公司对26届实习生也不太感冒,说什么不确定性大。而且我最近在准备考公,时间上也有点冲突。要是把时间花在实习上,备考时间就少了。但要是不实习,又怕以后就业有问题😫有没有懂行的友友帮我分析分析:26届现在不实习,秋招找工作真的会很难吗?考公和实习该怎么平衡啊?如果现在不实习,考完公再去找实习还来得及吗?真的太焦虑了,希望大家能给我点建议🙏
小破站_程序员YT:我可能和大家的观点不一样。人的精力是有限的,不能既要还要。你又想实习又想考公最后又要秋招上岸,我觉得哪有那么多的选择。你如果想考上岸,那就全力以赴。如果想秋招上岸,就继续投实习,投没了,就继续准备秋招,秋招不行继续春招。别到最后,考公没上岸,觉得是花了时间浪费在找实习上了, 秋招没上岸,觉得是浪费时间准备考公去了。我是认为很难说可以去平衡 不喜勿喷,可以叫我删除
点赞 评论 收藏
分享
迷茫的大四🐶:自信一点,我认为你可以拿到50k,低于50k完全配不上你的能力,兄弟,不要被他们骗了,你可以的
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-25 19:15
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务