无序链表
-
链表的实现
1)节点Node
class Node: def __init__(self, initdata): self.data = initdata self.next = None def getData(self): return self.data def getNext(self): return self.next def setData(self, newdata): self.data = newdata def setNext(self, newnext): self.next = newnext
2)无序表UnorderedList
class UnorderedList: def __init__(self): self.head = None def isEmpty(self): return self.head == None def add(self, item): temp = Node(item) temp.setNext(self.head) # 头插法 self.head = temp def size(self): current = self.head count = 0 while current != None: count = count + 1 current = current.getNext() return count def search(self, item): current = self.head found = False while current != None and not found: if current.getData() == item: found = True else: current = current.getNext() return found def remove(self, item): current = self.head previous = None found = False while not found: if current.getData() == item: found = True else: previous = current current = current.getNext() if previous == None: self.head = current.getNext() else: previous.setNext(current.getNext())
测试代码:
q = UnorderedList() print(q.isEmpty())#True q.add(4) q.add("dog") q.add(2) q.remove(4) print(q.search(2))#True print(q.size())#2
有序列表
1)Node节点:同上
2)有序表
class UnorderedList:
def __init__(self):
self.head = None
def isEmpty(self):
return self.head == None
def add(self, item):
temp = Node(item)
temp.setNext(self.head) # 头插法
self.head = temp
def size(self):
current = self.head
count = 0
while current != None:
count = count + 1
current = current.getNext()
return count
def search(self, item):
current = self.head
found = False
while current != None and not found:
if current.getData() == item:
found = True
else:
current = current.getNext()
return found
def remove(self, item):
current = self.head
previous = None
found = False
while not found:
if current.getData() == item:
found = True
else:
previous = current
current = current.getNext()
if previous == None:
self.head = current.getNext()
else:
previous.setNext(current.getNext())
链表实现的算法分析:
对于一个包含节点数为n的链表
- isEmpty是O(1),因为仅需要检查head是否为None
- size是O(n),因为除了遍历到表位,没有其他办法得知节点的数量
- search/remove以及有序表的add方法,则是O(n),因为涉及到链表的遍历,按照概率其平均操作次数是n/2
- 无序表的add方法是O(1),因为仅需要插入到表头