题目
leetcode 706
不使用任何内建的哈希表库设计一个哈希映射(HashMap)。
实现 MyHashMap 类:
- MyHashMap() 用空映射初始化对象
- void put(int key, int value) 向 HashMap 插入一个键值对 (key, value) 。如果 key 已经存在于映射中,则更新其对应的值 value 。
- int get(int key) 返回特定的 key 所映射的 value ;如果映射中不包含 key 的映射,返回 -1 。
- void remove(key) 如果映射中存在 key 的映射,则移除 key 和它所对应的 value 。
思路
同705,只是加入了新的value
代码
头文件 leetcode.h
#include <stdbool.h>
const int base = 769;
typedef struct tagListNode{
int key;
int val;
struct tagListNode *next;
} ListNode;
typedef struct {
ListNode *data;
} MyHashMap;
#ifdef __cplusplus
extern "C" {
#endif
MyHashMap *myHashMapCreate();
void myHashMapPut(MyHashMap *obj, int key, int value);
int myHashMapGet(MyHashMap *obj, int key);
void myHashMapRemove(MyHashMap *obj, int key);
void myHashMapFree(MyHashMap *obj);
#ifdef __cplusplus
}
#endif
源文件leetcode.c
#include <stdio.h>
#include "leetcode.h"
#include "string.h"
int hash(int key) {
return key % base;
}
void ListPush(ListNode *head, int key, int value)
{
ListNode *tmp = malloc(sizeof(ListNode));
tmp->key = key;
tmp->val = value;
tmp->next = head->next;
head->next = tmp;
}
void ListDelete(ListNode *head, int key)
{
for (ListNode *it = head; it->next; it = it->next) {
if (it->next->key == key) {
ListNode *tmp = it->next;
it->next = tmp->next;
free(tmp);
break;
}
}
}
ListNode *ListFind(ListNode *head, int key)
{
for (ListNode *it = head; it->next; it = it->next) {
if (it->next->key == key) {
return it->next;
}
}
return NULL;
}
void ListFree(ListNode *head)
{
while (head->next) {
ListNode *tmp = head->next;
head->next = tmp->next;
free(tmp);
}
}
MyHashMap *myHashMapCreate()
{
MyHashMap *ret = malloc(sizeof(MyHashMap));
ret->data = malloc(sizeof(ListNode) * base);
for (int i = 0; i < base; i++) {
ret->data[i].key = 0;
ret->data[i].val = 0;
ret->data[i].next = NULL;
}
return ret;
}
void myHashMapPut(MyHashMap *obj, int key, int value)
{
int h = hash(key);
ListNode *rec = ListFind(&(obj->data[h]), key);
if (rec == NULL) { // 没找到的话就新创建
ListPush(&(obj->data[h]), key, value);
} else { // 找到了就更新
rec->val = value;
}
}
int myHashMapGet(MyHashMap *obj, int key)
{
int h = hash(key);
ListNode *rec = ListFind(&(obj->data[h]), key);
if (rec == NULL) {
return -1;
}
return rec->val;
}
void myHashMapRemove(MyHashMap *obj, int key)
{
int h = hash(key);
ListDelete(&(obj->data[h]), key);
}
void myHashMapFree(MyHashMap *obj) {
for (int i = 0; i < base; i++) {
ListFree(&(obj->data[i]));
}
free(obj->data);
}