JavaScript实现哈希表时returnAll方法未返回所有插入节点问题求解
问题根源
- 你的
insert方法默认实现了相同key覆盖更新的逻辑:插入时只要检测到当前链表中存在相同key的节点,就会直接修改该节点的value值,不会新增节点存储旧的value,所以相同key的历史插入记录不会被保留,最终returnAll只会返回不同key的最新插入结果。 - 额外说明:你现有的
get方法还存在两处可修复问题:一是循环判断时取的是桶的头节点key而非当前遍历节点的key,二是遍历语句只写了currentNode.next没有赋值给currentNode,运行时会进入死循环。
修改方案
如果你的需求是存储所有插入的节点,允许重复key保留所有历史插入记录,只需要删除insert中所有相同key的判断更新逻辑,不管key是否重复,都直接在链表末尾新增节点即可,同时可按需修复get方法的逻辑:
class HasTable { constructor(size) { this.buckets = Array(size); this.numBuckets = this.buckets.length; } hash(key) { let sum = 0; for (let i = 0; i < key.length; i++) { sum += key.charCodeAt(i); } let bucket = sum % this.numBuckets; return bucket; } // 修改后的insert:删除相同key覆盖逻辑,直接追加新节点 insert(key, value) { let index = this.hash(key); console.log("INDEX", index); if (!this.buckets[index]) { this.buckets[index] = new HashNode(key, value); } else { let currentNode = this.buckets[index]; while (currentNode.next) { currentNode = currentNode.next; } currentNode.next = new HashNode(key, value); } } // 修复后的get:返回同一个key对应的所有插入value get(key) { let index = this.hash(key); if (!this.buckets[index]) return null; let values = []; let currentNode = this.buckets[index]; while (currentNode) { if (currentNode.key === key) { values.push(currentNode.value); } currentNode = currentNode.next; } return values.length ? values : null; } returnAll() { let allNodes = []; for (let i = 0; i < this.numBuckets; i++) { let currentNode = this.buckets[i]; while (currentNode) { allNodes.push({key: currentNode.key, value: currentNode.value}); currentNode = currentNode.next; } } return allNodes; }; } class HashNode { constructor(key, value, next) { this.key = key; this.value = value; this.next = next || null; } } // 测试代码 let has = new HasTable(30); has.insert("a", "gmail.com"); has.insert("b", "hotmail.com"); has.insert("b", "hotmailHOTMAIL.com"); has.insert("c", "gstar.com"); has.insert("d", "oke.com"); has.insert("e", "nice.com"); has.insert("e", "nice99.com"); has.insert("e", "nice101.com"); console.log(has.returnAll()); // 此时会输出8条节点,包含所有插入记录
内容的提问来源于stack exchange,提问作者mightycode Newton
相关产品推荐
相关产品推荐

