Lintcode 129. Rehashing
题目描述:
从这道题我们可以看出,在工程中如果使用哈希表时,在内存允许的情况下,一开始初始化的时候就尽量分配一个足够的内存容量,否则的话hash表容量不够进行rehashing时,效率会大大降低。当然了,面试的时候应该用不着这样做。
/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param hashTable: A list of The first node of linked list
* @return: A list of The first node of linked list which have twice size
*/
vector<ListNode*> rehashing(vector<ListNode*> hashTable) {
vector<ListNode*> anshashTable;
for (int i = 0; i < hashTable.size() * 2; i++) {
anshashTable.push_back(nullptr);
}
int HASH_SIZE = anshashTable.size();
for (int i = 0; i < hashTable.size(); i++) {
ListNode* p = hashTable[i];
while (nullptr != p) {
addnode(anshashTable, p->val);
p = p->next;
}
}
return anshashTable;
}
//将原哈希表中元素重新通过hash function计算,放入新的哈希表
void addnode(vector<ListNode*> &anshashTable, int number) {
int p = (number + anshashTable.size()) % anshashTable.size();
if (nullptr == anshashTable[p]) {
anshashTable[p] = new ListNode(number);
} else {
addlistnode(anshashTable[p], number);
}
}
//新的哈希表存放元素出现冲突时,进行元素的存放
void addlistnode(ListNode* node, int number) {
if (nullptr != node->next) {
addlistnode(node->next, number);
} else {
node->next = new ListNode(number);
}
}
};