当前位置: 首页 > news >正文

蓝桥杯备赛-基础训练(二)链表 day13

1、移除链表元素

题意:删除链表中等于给定值 val 的所有节点。

示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]

示例 2: 输入:head = [], val = 1 输出:[]

示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]

在这之前,我还是简单的说说在Python中的链表,

因为作为Python小白,我一开始对于Python的链表是很不清晰的。

根据Python中的基本数据类型,很明显没有什么可以直接的表示链表,Python是允许用户自己定义数据类型的,这就是所说的类。

在这里我们就选用类作为链表的节点(链表有两部分,一个是数据域,一个是指针域)

在Python中,类的实例化实际上是创建一个对象,这个对象存储在内存中。当我们调用类的方法时,实际上是在操作这个对象的引用(地址),因此可以用类来表示链表的结点,即链表的结点类型是:用户自定义的类。
 

class ListNode:
    def __init__(self,data):
        self.valu = data #表示数据域
        self.next = None #表示指针域

在我们已经表示了这个链表的节点以后,我们应该如何使用这个节点呢?

head = ListNode(1)

就是通过这个变量去指向这个节点,这个节点的指针域是空,

若我们希望在这个节点后添加节点,我们应该怎么做呢?

要给head所指向的这个节点的next(也就是指针域赋值)

赋什么值呢?

赋的就是想要添加的那个节点的地址

那么这个地址究竟等于什么呢?

这里用类来表示了

class ListNode:
    def __init__(self,data):
        self.valu = data #表示数据域
        self.next = None #表示指针域
head = ListNode(1)
head.next = ListNode(123)

调试过后的结果如下:

如果还想要添加节点呢?

class ListNode:
    def __init__(self,data):
        self.valu = data #表示数据域
        self.next = None #表示指针域
head = ListNode(1)
head.next = ListNode(123)
head = head.next
head.next = ListNode(456)

那大概知道了我们就开始正式的移除链表元素吧:

# 移除链表元素
# 初识链表
class ListNode:
    def __init__(self,data):
        self.value = data #表示数据域
        self.next = None #表示指针域
# head = ListNode(1)
# head.next = ListNode(123)
# head = head.next
# head.next = ListNode(456)

dummy_head = ListNode(None)#这是虚拟的头结点
current = dummy_head #用current来指向虚拟头结点,current.next才是指向第一个节点
n = 10
num = 0
for _ in range(0,n):
    current.next = ListNode(int(input("请输入数字:")))
    current = current.next

x = int(input("请输入你想要移除的元素的数值:"))

current = dummy_head
while current.next:
    if current.next.value==x:
        current.next = current.next.next
        num += 1
    else:
        current = current.next


current = dummy_head
while current:
    print(current.value, end=" -> " if current.next else "")
    current = current.next

关于最后的输出,给大家做个小小的解释:

current.value就是值的是值,而,后面的则指的是一个三元运算 如果current.next还有值,那么输出“->”,如果current.next已经是None了,那么就输出“”

2、设计链表

题意:

在链表类中实现这些功能:

  • get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
  • addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
  • addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
  • addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val  的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
  • deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
# 设计链表
class ListNode:
    def __init__(self,data=0,next=None):
        self.value = data
        self.next = next
# 定义类
class MylinkList:
    def __init__(self):
        self.dummy_head = ListNode()#虚拟头节点
        self.size = 0

    # 定义相关的函数
    def get(self,index: int) -> int:
        # 首先看index是不是合法的
        if index<0 or index>=self.size:
            return -1
        else:
            current = self.dummy_head.next #指向有值的第一个节点
            for i in range(0, index):
                current = current.next
            return current.value

    # 在头部增加一个值
    def addAtHead(self,value:int)->None:
        self.dummy_head.next = ListNode(value,self.dummy_head.next)
        self.size +=1

    # 在尾部增加一个值
    def addAtTail(self,value:int)->None:
        current = self.dummy_head
        while current.next:# 注意,这里必须是检查current.next 因为如果检查current的话,就会变成current是一个None,
                           # 我们是不能修改None的值的
            current = current.next
        current.next = ListNode(value,None)
        self.size += 1

    # 在链表中的第index个节点之前添加值为value的节点
    def addAtIndex(self,index:int, value:int)->None:
        if index < 0 or index > self.size:
            return
        current = self.dummy_head
        for i in range(0,index):
            current = current.next
        current.next = ListNode(value,current.next)
        self.size +=1

    # 在列表中指定删除某个值
    def deleteAtIndex(self,index:int)->None:
        if index < 0 or index > self.size:
            return
        current = self.dummy_head
        for i in range(0,index):
            current = current.next
        current.next = current.next.next
        self.size-=1

obj = MylinkList()#创立一个新的链表?
obj.addAtHead(11)
obj.addAtTail(100)

current = obj.dummy_head.next
while current.next:
    print(current.value)
    current = current.next

sub = obj.get(1)

current = obj.dummy_head.next
while current.next:
    print(current.value)
    current = current.next

obj.addAtTail(1)
obj.addAtTail(23)

current = obj.dummy_head.next
while current.next:
    print(current.value)
    current = current.next

obj.deleteAtIndex(2)

current = obj.dummy_head.next
while current.next:
    print(current.value)
    current = current.next

相关文章:

  • 【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的社区团购配送系统
  • 虚拟机网络ssh连接失败,没有网络
  • 在 Vue 3 中使用 ECharts 制作多 Y 轴折线图时,若希望 **Y 轴颜色自动匹配折线颜色**且无需手动干预,可以通过以下步骤实现:
  • 鸿蒙-验证码输入框的几种实现方式-上
  • 软件集成测试的技术要求
  • TCP和Http协议
  • import requests Pycharm 报错
  • 什么是向量化?ElasticSearch如何存储向量化?
  • fedora 安装 ffmpeg 过程记录
  • CUDA 安装 一直卡在Installing Nsight Visual Studio Edition
  • 在 Java 中解析 JSON 数据
  • 读写分离/双主双从
  • springboot中配置logback-spring.xml
  • [特殊字符] LeetCode 62. 不同路径 | 动态规划+递归优化详解
  • Canva迁移策略深度解析:应对每日5000万素材增长,从MySQL到DynamoDB的蜕变
  • Go 错误处理与调试:面向对象的入门教程
  • ubuntu20.04重启后不显示共享文件夹
  • 【C】队列与栈的相互转换
  • Python微博动态爬虫
  • python——Django 框架
  • 微软将裁员3%,减少管理层
  • 美国明尼苏达州发生山火,过火面积超80平方公里
  • 训练孩子的科学思维,上海虹口推出“六个一百”旗舰工程
  • 飙升至熔断,巴基斯坦股市两大股指收盘涨逾9%
  • 历史地理学者成一农重回母校北京大学,担任历史系教授
  • 梅花奖在上海|穿上初演时的服装,“鹮仙”朱洁静再起飞