目录
一、无序表unorderlist的链表实现
1、无序表的add方法
接下来考虑如何向无序表中添加数据项,实现add方法。由于无序表并没有限定数据项之间的顺序,因此新的数据项可以添加到原表的任何位置。
按照实现的性能考虑,我们首先想到的肯定是最容易加入的位置。那么,哪里是最容易加入的位置呢?
由链表的结构我们知道,要访问到整条链上的所有数据项,都必须从表头的head开始,沿着next链接逐个向后查找,所以添加数据项最快捷的位置是表头,也就是整个链的首位置。
代码实现:
def add(self, item):
tmp = Node(item)
tmp.setNext(self.head) # 和下一行的顺序不能反了
self.head = tmp
2、链表实现:size方法
size:从链条头head开始遍历到表尾同时用变量累加经过的节点的个数。
def size(self):
current = self.head
count = 0
while current != None:
count += 1
current = current.getNext()
return count
3、链表实现:search方法
从链表头head开始遍历到表尾,同时判断当前节点的数据项是否为目标。
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
4、链表实现:remove(item)方法
首先找到item,这个过程跟search方法一样,但是在删除节点时,需要特别的技巧:
- current指向的是当前匹配数据项的节点,而删除需要把前一个节点的next指向current的下一个节点
- 所以在用sear current的同时,需要维护前一节点的引用。
找到item之后,current指向item节点,previous指向前一个节点,开始执行删除。
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: # current是首个节点的情况
self.head = current.getNext()
else:
previous.setNext(current.getNext())
所有代码:
class Node():
def __init__(self, initdata):
self.data = initdata
self.next = None
def getData(self):
return self.data # 返回的数据项
def getNext(self):
return self.next # 返回next
def setData(self, newdata):
self.data = newdata # 设置新的数据项
def setNext(self, newnext):
self.next = newnext
class Unorderedlist:
def __init__(self):
self.head = None
def add(self, item):
tmp = Node(item)
tmp.setNext(self.head) # 和下一行的顺序不能反了
self.head = tmp
def size(self):
current = self.head
count = 0
while current != None:
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: # current是首个节点的情况
self.head = current.getNext()
else:
previous.setNext(current.getNext())