思路
链表由节点组成,先规定节点(Node),包含data和指向下个节点的next
-
初始化
data当然就是传入的data了,next指向None
-
添加
分两种情况:
- 链表为空,那么头节点和尾节点都指向新插入的节点
- 链表不为空,那么直接在尾部添加即可
-
遍历
因为只有链表的尾节点的next是指向None的,所以可以根据这点来从头遍历
-
删除某个节点
删除的时候分3种情况:
- 头节点,此时更改head指向的节点就好了
- 尾节点,此时只需将尾节点的前一个节点(prev)的next指向None即可
- 中间的节点,此时要将此节点的前一个节点的(prev)的next指向后续节点的(Current.next)
-
搜寻
遍历查找即可
-
清空链表
将头节点和尾节点都置为None即可
class Node:
def __init__(self,data):
self.next = None
self.data = data
class SinglyLinkedList:
def __init__(self):
self.head = None #头节点
self.tail = None #尾节点
self.size = 0 #链表长度
def append(self,data):
node = Node(data)
if self.tail: #如果链表不为空
self.tail.next = node
self.tail = node
else:
self.head = node
self.tail = node #如果这是第一个插入的节点那么头和尾都指向此节点
self.size += 1
def iter(self):
'''遍历链表'''
current = self.head
while current:
value = current.data
current = current.next
yield value
def delete(self,data):
'''根据数据删除节点'''
current = self.head
prev = self.head
while current:
if current.data == data:
if current == self.head:
self.head = current.next
elif current == self.tail:
prev.next = None
self.tail = prev
else:
prev.next = current.next
self.size -= 1
return
prev = current
current = current.next
def search(self,data):
'''搜寻某个节点'''
for node in self.iter():
if data == node:
return True
return False
def clear(self):
'''清空链表'''
self.tail = None
self.head = None