链表应用案例: 老鹰抓小鸡
-
把小鸡排队看作一个链表,每个节点记录一个小鸡,并记录指向下一个小鸡的地址
-
在小鸡总数范围内随机产生一个序数,产生的序数意味着对应的节点小鸡出队——删除该节点即可
# -*- coding:utf-8 -*-
"""
作者:bug君
日期:2023年 04月 08日
标题:链表应用
作用:
思路:在linkedList类里增加delNode()删除节点方法
"""
class Node:
def __init__(self, data=None, next=None):
self._elem = data
self._next = next
def setData(self, NewData):
self._elem = NewData
def setNext(self, NewNext):
self._next = NewNext
def getData(self):
return self._elem
def getNext(self):
return self._next
class LinkedList:
def __init__(self):
self._head = Node()
self._length = 0
def tail_add(self, NewData): # 向链表尾添加元素
NewNode = Node(NewData)
if self._length == 0:
self._head = NewNode
else:
curNode = self._head
while curNode.getNext(): # 遍历到结尾元素
curNode = curNode.getNext()
curNode.setNext(NewNode)
self._length += 1
def PrintLinkedList(self): # 遍历并打印节点数值
curNode = self._head
while curNode: # 这里跟上面 末尾添加元素不同, 需要遍历完链表全部元素
print(f'打印节点 : {curNode.getData()}')
curNode = curNode.getNext()
def getLength(self):
return self._length
def delNode(self, number):
curNode = self._head
if self._length <= 1: # 默认至少有一个节点,才进入删除模式
self._head = None
else:
nextNode = curNode.getNext()
if number == 1:
self._head = nextNode
return
cnt = 2
while cnt <= self._length:
if cnt == number:
if cnt == self._length:
curNode.setNext(None)
break
else:
curNode.setNext(nextNode.getNext())
break
curNode = nextNode
nextNode = nextNode.getNext()
cnt += 1
self._length -= 1
if __name__ == '__main__':
chicks = ['1号', '2号', '3号', '4号', '5号', '6号']
newLinked = LinkedList()
for chick in chicks:
newLinked.tail_add(chick)
print(newLinked.getLength())
newLinked.PrintLinkedList()
print("=========删除3号小鸡=========")
newLinked.delNode(3)
newLinked.PrintLinkedList()