自实现:《Python数据结构与算法分析》
P88 第三章的内容
实现了无序链表和有序链表
# 链表
#创建节点(node)
class Node:
def __init__(self, item):
self.data = item
self.next = None
# 获取节点数据
def getData(self):
return self.data
# 获取节点的下一个值
def getNext(self):
return self.next
# 设置节点数据
def setData(self, item):
self.data = item
# 设置节点的下一个节点
def setNext(self, newNext):
self.next = newNext
# 无序链表
class UnorderList:
def __init__(self):
self.head = None # 这里要把无序链表的头指向None,当加入第一个节点时,再将head指向新节点
def isEmpty(self):
return self.head == None
# 添加新元素
def addNode(self, value):
node = Node(value)
node.setNext(self.head)
self.head = node
# 计算链表长度
def length(self):
point = self.head
count = 0
while point:
count += 1
point = point.getNext()
return count
# 寻找元素
def search(self, item):
position = 0
point = self.head
while point:
position += 1
if point.getData() == item:
return position
point = point.getNext()
return "无该元素"
# 移除元素
def remove(self, item):
point = self.head
if point != self.head:
if point.getNext().getData() == item:
point.setNext(point.getNext().getNext())
else:
if point.getData() == item:
self.head = point.getNext()
# 有序列表
class OrderedList:
def __init__(self):
self.head = None
def isEmpty(self): # 判断是否为空
return not bool(self.head)
# 添加元素
def add(self, item):
node = Node(item)
if self.isEmpty():
self.head = node
else:
point = self.head
while point.getData() < item:
if point.getNext(): #如果下一个不是None
if point.getNext().getData() > item:
node.setNext(point.getNext())
point.setNext(node)
break
point = point.getNext()
else: # 如果下一个是None
node.setNext(point.getNext())
point.setNext(node)
break
if point.getData() > item:
node.setNext(point)
self.head = node
# 移除元素
def remove(self, item):
point = self.head
if not self.isEmpty():
while True:
if point.getData() == item:
self.head = point.getNext()
else:
if point.getNext().getData() == item:
point.setNext(point.getNext().getNext())
break
else:
point = point.getNext()
else:
return "列表为空"
# 计算链表长度
def length(self):
count = 0
point = self.head
while point:
count += 1
print(f'第{count}个:', point.getData())
point = point.getNext()
return count
# 搜索item
def search(self, item):
point = self.head
while point:
if point.getData() == item:
return True
point = point.getNext()
return False
#检索位置
def index(self, item):
count = 0
point = self.head
while point:
count += 1
if point.getData() == item:
return count
else:
point = point.getNext()
# 移除列表最后一个元素
def pop(self):
point = self.head
if not self.isEmpty():
while point.getNext().getNext():
point = point.getNext()
popNum = point.getNext().getData()
point.setNext(None)
return popNum
else:
return "列表为空"
# 移除指定位置上的元素
def pop(self, pos):
point = self.head
count = 1
if pos == self.length():
return self.pop()
while count < pos - 1 :
point = point.getNext()
count += 1
popNum = point.getNext().getData()
point.setNext(point.getNext().getNext())
return popNum