# 节点类,链表节点类分为data与next域
class Node:
def __init__(self,data):
self.data = data
self.next = None
# 单链表头节点
class SingleLinkList:
def __init__(self):
self._head = None
def add(self,data):
# 添加新节点
new_node = Node(data)
# 先处理新节点
new_node.next = self._head
# 再处理老节点
self._head = new_node
def travel(self):
# 对头结点进行备份
tmp = self._head
# 判断头结点是否指向有节点
while tmp:
# 打印指向节点的data数据域
print(tmp.data,end=" ")
# 获取下一节点
tmp = tmp.next
# 循环获取所有节点,直到最后一个节点,最后一个节点指向None,此时跳出循环
print()
def is_empty(self):
# 链表是否为空
return self._head is None
def length(self):
# 链表的长度
count = 0
tmp = self._head
while tmp:
count += 1
tmp = tmp.next
return count
def append(self,data):
# 在尾部追加节点
tmp = self._head
if tmp is None:
self.add(data)
else:
# 如果有下一个节点
while tmp.next:
tmp = tmp.next
new_node = Node(data)
new_node.next = tmp.next
tmp.next = new_node
def insert(self,pos,data):
count = 0
if pos <= 0:
self.add(data)
else:
tmp = self._head
# 查找到索引所在的节点的上一个元素
while count < pos-1 and tmp.next:
tmp = tmp.next
count +=1
new_node = Node(data)
new_node.next = tmp.next
tmp.next = new_node
def remove(self,data):
# 删除节点
tmp = self._head
if tmp is None:
return
# 第一个节点就是要删除的节点
if tmp.data == data:
old = tmp
self._head = old.next
old.next = None
return
# 删除其他节点
while tmp.next.data != data:
tmp = tmp.next
old = tmp.next
# tmp.next = tmp.next.next
tmp.next = old.next
# 将删除的节点的next清空
old.next = None
def reverse(self):
# 倒置
tmp = self._head
if tmp is None:
return
else:
# 备份
bak = tmp
# 循环拿到下一个节点
while bak.next:
bak = bak.next
if bak.data:
# 将获取的节点从头加进去
self.add(bak.data)
tmp.next = None
def test():
mynode = SingleLinkList()
mynode.append(2)
mynode.append(3)
mynode.append(4)
mynode.append(5)
mynode.reverse()
# mynode.remove(5)
# mynode.remove(2)
mynode.travel()
if __name__ == "__main__":
test()
链表的实现--代码演示
猜你喜欢
转载自blog.csdn.net/weixin_43958804/article/details/87922633
今日推荐
周排行