链表实现!

链表实现!

创建节点

class Node(object):
    #链表的构造函数
    def __init__(self, val):
        self.val = val
        #默认next属性的值是None
        self.next = None

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-umemT1LB-16在这里插入图片描述
79210780295)(C:\Users\86186\OneDrive\图片\本机照片\创建结点.png)]

创建链表

class MyLinkedList(object):
    def __init__(self):
        """在这里初始化数据"""
        #默认head属性的值是None
        self.head = None
        #默认size属性的值是0,因为初始结构链表时,没有元素,头节点是空节点
        self.size = 0

在这里插入图片描述
下面展示一些 内联代码片

self.head = Node()

在这里插入图片描述

查询链表

--snip--
	def get(self, index):
        """
        获取链表中的第index个节点的值,如果index无效,则返回-1
        :参数类型 index : int
        : 返回类型: int
        """
        #当需要寻找的地址超出了链表的范围时,返回-1表示无法找到
        if index < 0 or index >= self.size:
            return -1
        #当所需的链表为空时,也返回-1表示无法找到元素
        if self.head is None:
            return -1
        #从表头开始搜索直到搜索到相应的位置。由于链表不能和顺序表一样通过寻址的直接找到相应位置的元素,
        #所以要逐个搜索
        curr = self.head
        for i in range(index):
            curr = curr.next
        return curr.val
    

在这里插入图片描述

在表头插入结点


--snip--
	def addAtHead(self, val):
	"""
	在链表的第一个元素之前添加值val的节点
	插入后,新节点将成为链表的第一个节点
	:参数类型 val: int 
	:返回类型: void
	"""
    #创建一个Node类的对像并赋值给对像名为node的对象
    node = Node(val)
    #直接将node指向的下一个对象赋值为链表的头结点。此时node成了新的头结点
    node.next = self.head
    self.head = node
    #记得把结点属性中的size(链表大小,即链表包含的元素数量)
    self.size += 1

在这里插入图片描述

在这里插入图片描述

在表尾插入结点

--snip--
	def addAtTail(self, val):
        """
       	将值为val的结点追加到链表的最后一个元素之后
       	:参数类型 val: int
       	:返回类型: void
        """
        curr = self.head
        #如果链表头是空的,就相当于这个链表是空的,则将val直接作为头结点
        if curr is None:
            self.head = Node(val)
        #否则通过迭代找到当前链表的尾,并将链表尾指向的下一个对象赋值为新的结点
        else:
            while curr.next is not None:
                curr = curr.next
            curr.next = Node(val)
         #链表中多了一个元素,链表属性中的size要自增1
        self.size += 1
        #在链表中的指定位置插入元素
        

在这里插入图片描述

在链表任意位置插入结点

#在链表中的指定位置插入元素
	def addAtIndex(self, index, val):
     """
     在链表中的索引结点之前添加值为val的结点
     如果index等于链表的长度,则该结点将附加到链表的末尾
     如果index大于链表的长度,则不会插入结点
     :参数类型 index: int
     : 参数类型 val: int
     :返回类型:void
     """
    #如果位置不合法, 地址超出了链表的范围,则直接停止添加并终止该方法
    if index < 0 or index >self.size:
        return 
    #如果在头结点, 调用addAtHead(val)方法即可
    if index == 0:
        self.addAtHead(val)
    #如果在其他合法位置,则逐个遍历找到合适的位置
    else:
        curr = self.head
        #curr遍历i-1个元素,目前curr是第i-1个元素
    for i in range(index-1):
        curr = curr.next
        #然后将第i-1个结点指向node
    node = Node(val)
    #先将要插入的结点node指向插入的位置的下一个结点(index节点)
    node.next = curr.next
    #然后将第i-1个结点指向node
    curr.next = node
    #多了一个元素,size自增1
    self.size += 1
    

在这里插入图片描述
在这里插入图片描述

删除任意位置的结点

--snip--
	def deleteAtIndex(self,index):
        """
        如果index是有效的,则删除链表中的第index个结点
        :参数类型 index : int
        :返回类型: void
        """
        #如果位置不合法,地址超出了链表的范围,则直接停止添加并终止该方法
        if index < 0 or index >= self.size:
            return 
        curr = self.head
        #如果要删除的是头结点,则直接将链表的头结点后移
        if index == 0:
            self.head = curr.next
        #否则先找到要删除结点的前一个结点curr
        else:
            for i in range(index - 1)
            	curr = curr.next
            #curr 指向要删除结点的下一个结点,这样就能删除要删除的结点了
            curr.next = curr.next.next
         #少了一个元素, size自减1
        self.size -= 1 

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值