首先是Python中结点的表示方法
类似于C语言,C语言中用结构体来表示,而Python中用类来表示
1. 用class来表示结点
class ListNode(object):
def __init__(self,val,next = None):
self.val = val #数据域
self.next = next #指针域
在这个类中包含了数据域和指针域,数据域val是当前结点的值,指针域next是指向下一个结点的指针。
2.使用尾插法来创建一个结点
def Creat(self,n): #创建链表
head = [] #用列表来存储结点
for i in range(n):
head.append(ListNode(i)) #尾插建立链表
for i in range(n-1):
head[i].next = head[i+1] #连接链表
return head #返回头结点
head是一个列表,用来存储结点,n为传入的结点个数。第一个for循环中调用ListNode类来创建结点,并用append方法来将新建立的结点储存在列表尾。第二个for循环让前一个结点的指针域指向下一个结点,两个for循环实现链表的创建。
3.打印链表
def Printf(self,head): #打印链表
while head is not None:
print(head.val) #输出结点的数据域
head = head.next
只要下一个结点不为空,就不断打印每个结点的数据域。
4.在指定位置插入元素
def Insert(self,value,n,node): #在指定位置插入元素
if n < len(node): #判断插入的指定的位置是否合法
node.insert(n, ListNode(value))
for i in range(len(node) - 1):
node[i].next = node[i + 1] # 插入后重新连接结点
return node
else:
print("插入的位置不合法")
传入的参数分别是value是值,n是指定的位置,node是储存结点的列表。首先需要判断插入的位置是否合法,如果n>链表的长度则不合法,输出提示。如果插入位置合法,调用ListNode类创建结点并用insert方法插入到指定位置。注意,以上操作并没有把新建立的结点连接到原链表,需要一个for循环来重新连接链表。
5.在指定位置插入元素
def Deleta(self, n, node): #删除指定位置元素
if n < len(node): #判断插入的位置是否合法
node.pop(n)
for i in range(len(node) - 1):
node[i].next = node[i + 1] #删除后重新连接结点
return node
else:
print('删除的位置不合法')
传入的参数,n是指定的位置,node是存储结点的列表。首先判断删除的指定位置是否合法,即判断位置索引和链表长度的关系。如果不合法输出提示,如果合法,调用pop方法来删除指定位置的结点。注意,删除结点后原链表就从此位置断开了,需要一个ffor循环重新连接链表。
6.输出链表结点个数
def CoundNodes(self,head): #输出链表节点数
cnt = 0 #结点数初始化为0
while head is not None: #只要下一个结点不为空
cnt += 1
head = head.next #结点后移
return cnt #返回结点个数
传入的参数head是存储链表结点的列表。cnt初始化为0,用来记录结点的个数。在while循环中,只要链表的后继结点不为空,结点数就加1,最后返回结点个数。
完整代码
class ListNode(object):
def __init__(self,val,next = None):
self.val = val #数据域
self.next = next #指针域
#链表节点个数
class Solution():
def Creat(self,n): #创建链表
head = [] #用列表来存储结点
for i in range(n):
head.append(ListNode(i)) #尾插建立链表
for i in range(n-1):
head[i].next = head[i+1] #连接链表
return head #返回头结点
def CoundNodes(self,head): #输出链表节点数
cnt = 0 #结点数初始化为0
while head is not None: #只要下一个结点不为空
cnt += 1
head = head.next #结点后移
return cnt #返回结点个数
def Printf(self,head): #打印链表
while head is not None:
print(head.val) #输出结点的数据域
head = head.next
def Insert(self,value,n,node): #在指定位置插入元素
if n < len(node): #判断插入的指定的位置是否合法
node.insert(n, ListNode(value))
for i in range(len(node) - 1):
node[i].next = node[i + 1] # 插入后重新连接结点
return node
else:
print("插入的位置不合法")
def Deleta(self, n, node): #删除指定位置元素
if n < len(node): #判断插入的位置是否合法
node.pop(n)
for i in range(len(node) - 1):
node[i].next = node[i + 1] #删除后重新连接结点
return node
else:
print('删除的位置不合法')
if __name__ == '__main__':
node = Solution().Creat(7) #创建一个7个结点的链表
Solution().Printf(node[0]) #打印链表
print('--------')
node = Solution().Insert(520,3,node) #在4位置插入520
Solution().Printf(node[0])
print('--------')
node = Solution().Deleta(5,node) #删除6位置的结点
Solution().Printf(node[0])
print(f'节点个数为:{Solution().CoundNodes(node[0])}')
2021.10.03.LN