class LinkList():
class Node():
def __init__(self,item=None):
self.item=item
self.next=None
class LinkListIterator():
def __init__(self,node):
self.node=node
def next(self):
if self.node:
cur_node=self.node
self.node=cur_node.next
return cur_node.item
else:
raise StopIteration
def __iter__(self):
return self
def __init__(self):
self.head=None
def append(self,item):
node=self.Node(item)
if not self.head:
self.head=node
else:
node.next=self.head
self.head=node
def delete(self,obj):
CurNode=self.head
while CurNode:
if CurNode.next.item==obj:
CurNode.next=CurNode.next.next
return True
CurNode=CurNode.next
else:
raise IndexError('linklist have no num %d'%obj)
def find(self,obj):
for n in self:
if n==obj:
return True
else:
return False
def __iter__(self):
return self.LinkListIterator(self.head)
def __repr__(self):
return '<<'+','.join(map(str,self))+'>>'
class HashTable():
def __init__(self,size):#hashtable len:size
self.size=size
self.hashtable=[LinkList() for i in range(size)]
def append(self,item):
self.hashtable[self.hash_func(item)].append(item)
def hash_func(self,item):
return item%self.size
def __repr__(self):
return ','.join(map(str,self.hashtable))
def delete(self,obj):
k=self.hash_func(obj)
if self.hashtable[k].find(obj):
self.hashtable[k].delete(obj)
return True
else:
raise IndexError('hashtable have no num %d'%obj)
def find(self,obj):
k=self.hash_func(obj)
for n in self.hashtable[k]:
if n==obj:
return True
else:
return False
ll=LinkList()
ll.append(1)
ll.append(2)
ll.append(3)
ll.append(4)
ll.append(5)
print ll
print ll.find(3)
ll.delete(3)
print ll
h=HashTable(10)
for i in range(100):
h.append(i)
print h
print h.find(44)
h.delete(44)
print h
print h.find(44)
h.delete(111)
头插链表,长度为size的哈希表。(这个代码对齐方式我真的搞不定。。)
输出结果:
<<5,4,3,2,1>>
True
<<5,4,2,1>>
<<90,80,70,60,50,40,30,20,10,0>>,<<91,81,71,61,51,41,31,21,11,1>>,<<92,82,72,62,52,42,32,22,12,2>>,<<93,83,73,63,53,43,33,23,13,3>>,<<94,84,74,64,54,44,34,24,14,4>>,<<95,85,75,65,55,45,35,25,15,5>>,<<96,86,76,66,56,46,36,26,16,6>>,<<97,87,77,67,57,47,37,27,17,7>>,<<98,88,78,68,58,48,38,28,18,8>>,<<99,89,79,69,59,49,39,29,19,9>>
True
<<90,80,70,60,50,40,30,20,10,0>>,<<91,81,71,61,51,41,31,21,11,1>>,<<92,82,72,62,52,42,32,22,12,2>>,<<93,83,73,63,53,43,33,23,13,3>>,<<94,84,74,64,54,34,24,14,4>>,<<95,85,75,65,55,45,35,25,15,5>>,<<96,86,76,66,56,46,36,26,16,6>>,<<97,87,77,67,57,47,37,27,17,7>>,<<98,88,78,68,58,48,38,28,18,8>>,<<99,89,79,69,59,49,39,29,19,9>>
False
Traceback (most recent call last):
File “1.py”, line 418, in
h.delete(111)
File “1.py”, line 390, in delete
raise IndexError(‘hashtable have no num %d’%obj)
IndexError: hashtable have no num 111