(二) 链表
定义
链表是一种线性表结构,相比较数组,链表稍微复杂一点,链表不需要一组连续的内存空间,它通过指针将一组零散的内存空间连起来使用。因此一组数据存储在链表中消耗的内存要比数组多,因为需要指针存储下一个数据的地址,会产生额外的空间。
# 创建存储int类型数据的链表节点类
class Node():
'''链表结构的Node节点'''
def __init__(self, val, next = None):
'''Node节点的初始化方法.
参数:
val:存储的数据
next:下一个Node节点的引用地址
'''
self.val = val
self.next = next
单链表
# 创建一个单向链表类
class SinglyLinkedList():
'''单向链表'''
def __init__(self):
'''单向列表的初始化方法.'''
self.head = None
双向链表
循环链表
双向循环链表
链表的基本操作
**查找数据:**链表要查找数据只能通过遍历的方式查找满足指定条件的数据,所以时间复杂度为O(n)。
def findByValue(self, value):
'''按照数据值在单向列表中查找.
参数:
value:查找的数据
返回:
Node
'''
if not self.head:
return
flag = self.head
while flag:
if flag.val == value:
return flag
flag = flag.next
return
def findByIndex(self, index):
'''按照索引值在列表中查找.
参数:
index:索引值
返回:
Node
'''
if index < 0 or self.head == None:
return
i = 0
node = self.head
while i <= index:
node = node.next
return node
**插入数据:**链表插入数据,需要知道要插入的位置的前一个节点,然后用要插入的节点指向该节点的下一个节点,再用该节点指向新的要插入的节点就完成了。
def insertNodeInTail(self, value):
'''在链表的末尾插入一个存储value数据的Node节点.
参数:
value:将要存储在新Node节点中的数据
'''
node = Node(value)
if not self.head:
self.head = node
return
temp = self.head
while temp.next:
temp = temp.next
temp.next = node
return
def insertNodeInHead(self, value):
'''在链表的头部插入一个存储value数据的Node节点.
参数:
value:将要存储在新的Node节点中的数据
'''
node = Node(value)
if not self.head:
self.head = node
return
node.next = self.head
self.head = node
return
**删除数据:**链表删除指定数据,只需要将指定数据的前一个节点指向它的下下个节点即可。
def deleteByValue(self, value):
'''在链表中删除指定存储数据的Node节点.
参数:
value:指定的存储数据
'''
if not self.head:
return
prev = self.head
curr = self.head
while curr:
if curr.val == value:
prev.next = curr.next
return
prev = curr
curr = curr.next
return
def deleteByIndex(self, index):
'''在链表中删除指定位置的Node节点.
参数:
index:索引值
'''
if index < 0 or self.head == None:
return
i = 0
prev = self.head
curr = self.head
while i < index:
if not curr:
return
prev = curr
curr = curr.next
i += 1
prev.next = curr.next
return
应用
1、缓存清理