链表
链表是常见的一种数据结构,其中每个节点都分为数据域和指针域,指针域存储的为下一节点的地址。
1、节点的定义
class Node:
'''
定义节点
'''
def __init__(self, initData):
self.data = initData
self.next = None
def getData(self):
return self.data
def getNext(self):
return self.next
def setData(self, newData):
self.data = newData
def setNext(self, newNext):
self.next = newNext
2、初始化一个空链表
链表的初始化,定义了一个头指针,并使头指针为None
class linkList:
def __init__(self):
self.head = None
3、链表的操作
链表的操作包括插入(从头部插入、从指定位置插入),删除(从头部删除、从指定位置删除),查找等。
3.1、头部插入
def insertDataFront(self, newData):
newdata = Node(newData) # 将新元素值转为新节点
newdata.setNext(self.head) # 将头指针指向的地址赋值给新节点的指针域
self.head = newdata # 将新节点的地址赋值给头指针
3.2、指定位置插入
def insertData(self, newData, indexNum):
if indexNum == 1: # 在第一个位置插入即为在头部插入
linkList.insertDataFront(self, newData)
else:
newdata = Node(newData)
p = self.head # 将头指针赋值给一个新指针
# 通过循环找到插入位置(指定位置的前一个),期间指针p不断移动
for i in range(1, indexNum):
if p is None:
print('非法插入位置')
break
if indexNum - 1 != i:
p = p.getNext()
newdata.setNext(p.getNext()) # 将p指针指向的节点的指针域赋值给新节点的指针域
p.setNext(newdata) # 将新节点的地址赋值给p指向的节点的指针域
3.3、删除
删除过程与插入过程类似。
# 从链表的头部删除
def rmNodeFront(self):
self.head = self.head.getNext()
# 删除指定位置节点
def rmNode(self, indexNum):
if indexNum == 1:
linkList.rmNodeFront(self)
else:
p = self.head
for i in range(1, indexNum):
if p is None:
print('非法删除位置')
break
if indexNum - 1 != i:
p = p.getNext()
q = p.getNext()
p.setNext(q.getNext())
q.setNext(None)
3.4、查找
# 查找某个元素是否在链表中
# 指针不断移动,每次移动比较p指向的节点的数据域的值是否与要查找的值相等
def searchNode(self, targetNum):
p = self.head
while p is not None:
if p.getData() == targetNum:
print('此链表中存在', targetNum)
break
elif p.getNext() is None:
print('此链表中不存在', targetNum)
break
else:
p = p.getNext()
3.5、其他一些操作
# 链表长度
def linkListLength(self):
count = 0
p = self.head
while p is not None:
count = count + 1
p = p.getNext()
return count
def isEmpty(self):
return self.head is None
# 输出链表
def printLinkList(self):
linklist = []
p = self.head
while p is not None:
linklist.append(p.getData())
p = p.getNext()
return linklist
3.6、测试
if __name__ == '__main__':
l = linkList()
# 插入数据(链表头部)
l.insertDataFront(2)
l.insertDataFront(3)
l.insertDataFront(4)
print(l.printLinkList())
# 在第2个位置插入
l.insertData(5, 2)
print(l.printLinkList())
# 从链表头部删除
l.rmNodeFront()
print(l.printLinkList())
# 删除第1个位置节点
l.rmNode(1)
print(l.printLinkList())
# 在第1个位置插入
l.insertData(100, 1)
print(l.printLinkList())
print('链表长度为:', l.linkListLength())
l.searchNode(3)
l.searchNode(5)
结果:
[4, 3, 2]
[4, 5, 3, 2]
[5, 3, 2]
[3, 2]
[100, 3, 2]
链表长度为: 3
此链表中存在 3
此链表中不存在 5