Python实现单链表

首先是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

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值