1.设计Node结构,包括一个元素域(elem)和链接域(next)
class Node(object):
def __init__(self,elem,next=None):
self.elem=elem
self.next=next
2.设计单链表结构,由Node节点构成
class List(object):
# 初始化
def __init__(self):
self.head=None
#判断是否为空 True为空,False为不空
def is_empty(self):
return self.head is None
#首端添加
def preappend(self,elem):
p=Node(elem)
p.next=self.head
self.head=p
# self.head=Node(elem,self.head)
#首端删除
def prepop(self):
if self.is_empty() is False:
e=self.head.elem
self.head=self.head.next
return e
#从小到大排序
def sort(self):
if self.head is None:
return
q=self.head.next#从第二个Node开始比较
while q is not None:
p=self.head
while p is not q and p.elem<=q.elem:#直到遇到比首元素大的节点退出
p=p.next
while p is not q:#把大于首节点元素的Node的elem交换
p.elem,q.elem=q.elem,p.elem
p=p.next
q=q.next
#尾端添加
def append(self,elem):
if self.head is None:
self.head=Node(elem)
return
p=self.head
while p.next:
p=p.next
p.next=Node(elem)
#显示数据
def show(self):
if self.head:
p=self.head
while p:
yield p.elem
p=p.next
#删除尾端元素
def pop(self):
if self.head:
if self.head.next is None:
print(self.head.elem)
self.head=None
else:
p=self.head
while p.next.next:
p=p.next
print(p.next.elem)
p.next=p.next.next
#删除指定元素
def remove(self,elem):
if self.head:
if self.head.elem==elem:
self.head=self.head.next
else:
q=self.head
while q.next:
if q.next.elem==elem:
q.next=q.next.next
q=q.next
需要注意的是,部分操作需要判断链表是否为空然后进行
3.以上操作基本构成了一个简单的单链表,
(1)测试Node
if __name__=='__main__':
node1=Node(1)
p=node1
for i in range(2,11):
p.next=Node(i)
p=p.next
p=node1
while p:
print(p.elem,end=' ')
p=p.next
输出结果为:
1 2 3 4 5 6 7 8 9 10
(2)测试链表
if __name__=='__main__':
List1=List()
for i in range(5):
List1.append(i)
for x in List1.show():
print(x,end=' ')
print()
List1.remove(2)
print('删除2后:')
for x in List1.show():
print(x,end=' ')
输出结果为:
0 1 2 3 4
删除2后:
0 1 3 4
4.扩展单链表
(1)增加last链接域,使从链表末尾的时间复杂度由O(n)变为O(1),不过也增加了相应的空间复杂度
class LList(List):
def __init__(self):
List.__init__(self)
self.last=None
def preappend(self,elem):
if self.head is None:
self.head=Node(elem)
self.last=self.head
else:
q=Node(elem)
q.next=self.head
self.head=q
def append(self,elem):
if self.head is None:
self.head=Node(elem)
self.last=self.head
else:
q=Node(elem)
self.last.next=q
self.last=q
def pop(self):
if self.head:
if self.head.next is None:
print(self.head.elem)
self.head=None
else:
p=self.head
while p.next.next:
p=p.next
print(p.next.elem)
p.next=p.next.next
self.last=p
(2)环链表,其特征是最后一个Node节点的next不在指向None,而是指向表的第一个节点
class LCLIst(object):
def __init__(self):
self.last=None
def is_empty(self):
return self.last is None
#前端插入
def preappend(self,elem):
q=Node(elem)
if self.last is None:
q.next=q
self.last=q
else:
q.next=self.last.next
self.last.next=q
#尾端加入
def append(self,elem):
q=Node(elem)
if self.last is None:
q.next=q
self.last=q
else:
q.next=self.last.next
self.last.next=q
self.last=q
#前端删除
def prepop(self):
if self.last is not None:
self.last.next=self.last.next.next
def show(self):
if self.is_empty():
return
else:
q=self.last.next
while True:
print(q.elem)
if q.next is self.last.next:
break
q=q.next
5.总结
其实弄懂链表原理之后,一些链表的方法也很好写的