最近在学数据结构的C语言实现,同时希望加深自己对数据结构的理解,想要用Python也实现一下,但是Python实现相比C实现代码显得简而易懂。
链表的定义
采用链式存储结构的线性表称为链表
分类
从链接方式:单链表、循环链表、双链表
结点类:
Node(结点)有两个域,一个是数据域(存值),另外一个是指针域(存地址)
其中头结点的数值域通常不存储值
给一个带头结点的单链表的例子:
结点的指针域存的是下一个结点的存储地址:
尾插法
即将一个结点插入到链表的末尾。
先将待插入结点的指针域指向尾结点的指针域指向的存储位置(即None),再将尾结点的指针域指向待插入结点
头插法
即将一个结点插入到链表的头。
先将待插入结点的指针域指向头结点的指针域指向的存储位置(即c2),再将头结点的指针域指向待插入结点
Aclass Node: #结点类
def __init__(self,data):
self._data = data
self._next = None
class LinkList: #链表类
def __init__(self):
self._head = Node(None)
self._tail = self._head
self._len = 0
def addNode_tail(self,data): #尾插法插入结点
new_node = Node(data) #实例化一个结点
self._tail._next = new_node #修改尾结点的指针域
self._tail = new_node #修改尾结点位置
self._len +=1
def addNode_head(self,data):#头插法插入结点
new_node = Node(data) #实例化一个结点
new_node._next = self._head._next #修改插入结点的指针域
self._head._next = new_node #修改头结点的指针域
self._len +=1
def insertNode(self,data,pos):#在第pos个结点前插入结点
if pos > self._len or pos < 1:
print("inputs pos is error!")
return False
else:
temp = self._head
ins_node = Node(data)
for i in range(pos-1): #找到第pos-1个结点,即目标结点的前结点,然后尾插
temp = temp._next
ins_node._next = temp._next
temp._next =ins_node
self._len +=1
return True
def delnode_pos(self,pos=1): #删除第pos个结点,默认删除第一个
if pos > self._len or pos <1:
print("inputs pos is error!")
return False
if pos == 1:
self._head._next = sef._head._next._next
self._len -=1
else:
temp = self._head
for i in range(pos-1): #找到待删除结点的前一个结点
temp = temp._next
temp._next = temp._next._next #修改其指针域,即略过待删除结点
self._len -=1
return True
def printLink(self): #打印链表
temp = self._head._next
for i in range(self._len):
print(temp._data,end = "->")
temp = temp._next
print("None")
def changeNodeData(self,pos,data): #改变结点数据
if pos > self._len or pos <1:
print("inputs pos is error!")
return False
temp = self._head
for i in range(pos):
temp = temp._next
temp._data = data
return True
def getNodeData(self,pos): #返回结点的数据
if pos > self._len or pos <1:
print("inputs pos is error!")
return False
temp = self._head
for i in range(pos):
temp = temp._next
return temp._data
def getLinkLen(self): #返回链表长度
return self._len
def reverseLink(self): #链表反转(实质也就是将原来的链表重新进行头插建表)
temp = self._head._next._next._next
pre = self._head._next._next
self._tail = self._head._next
self._tail._next = None
while temp:
pre._next = self._head._next
self._head._next = pre
pre = temp
temp = temp._next
pre._next = self._head._next
self._head._next = pre
return True
def connectLink(self,link): #连接两个链表
self._tail._next = link._head._next
self._len = self._len + link._len
return True