You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于单链表的哈希表插入功能故障求助

哈希表插入问题的解决方案

嘿,我一眼就瞅到你代码里的问题啦!咱们来拆解下为啥后续插入没生效:

你的insertKey函数在处理非空哈希桶时,遍历逻辑出了岔子。你用while (temp != NULL)循环到temp变成空指针,这时候给temp赋值新节点——但**temp只是个局部变量啊!** 它和原链表的最后一个节点已经没任何关联了,你改的只是这个临时指针的指向,根本没把新节点链接到原链表的尾部。

修正后的代码

void insertKey(int key) { 
    int i = Hash(key); 
    Node* temp = HashTable[i]; 
    Node* NewNode = new Node; 
    NewNode->key = key; 
    NewNode->next = NULL; 

    if (temp == NULL) { 
        HashTable[i] = NewNode; 
    } else { 
        // 遍历到链表的最后一个节点(而非temp变成NULL)
        while (temp->next != NULL) { 
            cout << "NOTHere "; 
            temp = temp->next; 
        } 
        // 把最后一个节点的next指向新节点,真正加入链表
        cout << "FoundYa "; 
        temp->next = NewNode; 
    } 
}

关键修正点

  1. 调整遍历终止条件:从temp != NULL改成temp->next != NULL,循环结束时temp是链表的最后一个有效节点,而非空指针。
  2. 真正链接新节点:直接修改temp->next指向新节点,这样新节点才会被挂到原链表的尾部,而不是修改一个无关的局部指针。

额外小建议

如果你的哈希表需要避免重复key,可以在遍历的时候加个判断:

while (temp != NULL) {
    if (temp->key == key) {
        // 已存在相同key,释放新节点避免内存泄漏,直接返回
        delete NewNode;
        return;
    }
    if (temp->next == NULL) break;
    temp = temp->next;
}

内容的提问来源于stack exchange,提问作者Shaharyar Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 15:27:53