使用python实现链表

手写代码

class Node(object):
    def __init__(self, item):
        self.item = item
        self.next = None


class LinkListFunction(object):
    """
       此对象为Node对象的方法类
       """

    def __init__(self):
        self.linklistlength = 0  # 当前链表的长度

    def create_linklist_head(self, li):
        head = Node(li[0])
        for element in li[1:]:
            node = Node(element)
            node.next = head
            head = node
            self.linklistlength += 1
        return head

    def creat_linklist_tail(self, li):
        """
        尾插法
        :param li:
        :return:
        """
        head = Node(li[0])
        tail = head
        for element in li[1:]:
            node = Node(element)
            tail.next = node
            tail = node
            self.linklistlength += 1
        return head

    def print_linklist(self, lk):
        while lk:
            if not lk.next:
                print(lk.item)
                lk = lk.next
            else:
                print(lk.item, end=",")
                lk = lk.next

    def insert_linklist(self, index, element, curNode):
        """
        我们这里默认将插入的结点,插到我们的索引元素位置后方
        :param index:插入的索引值位置
        :param element: 插入的元素
        :param curNode: 首先指向的头结点
        :return:
        """
        lk_head = curNode  # 想用lk_head保存头指针
        number = 0  # 用于判断到达了我们需要寻找的位置
        if index > self.linklistlength:
            raise Exception("你的索引值超过了整个链表的最大长度")
        else:
            while True:
                if number == index:
                    break
                curNode = curNode.next
                number += 1
            self.linklistlength += 1
            p = Node(element)  # 创建一个链表节点
            p.next = curNode.next
            curNode.next = p
            curNode = lk_head  # 让curNode指针重新指向头结点

    def delete_linklist(self, index, curNode):
        """
        此为整个链表的删除算法,默认删除index后方的结点
        :param index:索引值
        :param curNode: 头结点
        :return:
        """
        lk_head = curNode
        number = 0  # 用与判断是否到达了我们需要寻找的位置
        if index > self.linklistlength:
            raise Exception("你的索引值超过了整个链表的最大长度")
        else:
            while True:
                if number == index:
                    break
                curNode = curNode.next
                number += 1
            self.linklistlength -= 1
            p = curNode.next  # 这是我们要删除的节点
            curNode.next = curNode.next.next
            del p


lkfunction = LinkListFunction()
lk = lkfunction.create_linklist_head([1, 2, 3, 4])
lkfunction.print_linklist(lk)
print(lkfunction.linklistlength)
lkfunction.insert_linklist(1, 10, lk)
lkfunction.print_linklist(lk)
print(lkfunction.linklistlength)
lkfunction.delete_linklist(0, lk)
lkfunction.print_linklist(lk)
print(lkfunction.linklistlength)

首先我们定义了一个Node对象,其接下来就是我们所有创建链表的结点对象

然后定义了一个对Node对象进行操作的一个方法类,其中包括封装好的创建链表中的头插法,尾插法,依次打印链表数据,插入结点数据,和删除加点数据。如果有什么看不懂的可以直接私信我哦!!!

输出结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/254346.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言学习第二十六天(算法的时间复杂度和空间复杂度)

1、算法效率 衡量一个算法的好坏,是从时间和空间两个方面来衡量的,换句话说就是从时间复杂度和空间复杂度来衡量的 这里需要补充一点:时间复杂度是衡量一个算法的运行快慢,空间复杂度是主要衡量一个算法运行所需要的额外空间。 …

「Verilog学习笔记」交通灯

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 timescale 1ns/1nsmodule triffic_light(input rst_n, //异位复位信号,低电平有效input clk, //时钟信号input pass_request,output wire[7:0]clock,output reg…

Shared Worker的快速理解与简单应用

SharedWorker 是 HTML5 中引入的一种 WebWorkers 类型,用于在浏览器中创建可在多个浏览器窗口或标签页之间共享的后台线程。Web Workers 是在主线程之外运行的脚本,允许执行一些耗时的任务而不会阻塞用户界面。 对 SharedWorker 的概念、理解和应用的简要…

2023第十七届中国品牌节,酷开科技荣获金谱奖!

11月18日,以“复苏与腾飞”为主题的2023第十七届中国品牌节,在杭州市云栖小镇国际会展中心盛大开幕。来自政界、商界、文化界等领域的6000余名嘉宾出席本次盛会,共同见证了民族品牌的崛起,全力奉献一场史无前例的“品牌人的亚运会…

Pikachu漏洞练习平台之暴力破解(基于burpsuite)

从来没有哪个时代的黑客像今天一样热衷于猜解密码 ---奥斯特洛夫斯基 Burte Force(暴力破解)概述 “暴力破解”是一攻击具手段,在web攻击中,一般会使用这种手段对应用系统的认证信息进行获取。 其过程就是使用大量的认证信息在认…

【操作系统】实验名称: 实验五 文件系统

实验目的: 1. 掌握文件系统的基本概念和工作机制 2. 掌握文件系统的主要数据结构的实现 3、掌握软件系统实现算法 实验内容: 设计并实现一个虚拟的一级(单用户)文件系统程序 提供以下操作 1、文件创建/删除接口命令 2、目录创建/删…

合并 K 个排序链表——Java解答

题目:合并 K 个排序链表 题目描述: 给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例: 假设有以下三个链表: 1->4->5, 1->3->4,…

QUIC在零信任解决方案的落地实践

一 前言 ZTNA为以“网络为中心”的传统企业体系架构向以“身份为中心”的新型企业安全体系架构转变,提供解决方案。随着传统网络边界不断弱化,企业SaaS规模化日益增多,给终端安全访问接入创造了多元化的空间。其中BYOD办公方式尤为突出&#…

SpringBoot使用@DS配置 多数据源 【mybatisplus druid datasource mysql】

项目最近需要使用多数据源,不同的mapper分别读取不同的链接,本项目使用了mybatisplus druid 来配置多数据源,基于mysql数据库。 目录 1.引入依赖 ​2.配置文件 application.yaml 3.Mapper中使用DS切换数据源 4.使用DS的注意事项 1.引入依…

苹果忽略iPhone?2024可穿戴产品或成重心!

一代版本一代神,即便是强如iPhone也有着被忽视的一天,当然,这么说有些夸张。虽然iPhone永远都是苹果最重要的产品,但在明年,苹果的重心将偏向其他产品。 彭博社记者马克古曼(Mark Gurman)在新一…

如何确保对称密钥管理的存储安全?

确保对称密钥管理的存储安全是保障信息安全的重要一环。以下是一些建议,以确保对称密钥管理的存储安全: 使用安全存储设备:选择使用经过验证的安全存储设备来存储对称密钥。这些设备通常具有高度的物理安全性,可以防止未经授权的访…

使用Umi搭建React项目

环境准备 一、首先确保有 node环境,并确保 node 版本是 14 或以上。(推荐用 nvm 来管理 node 版本,windows 下推荐用 nvm-windows) nvm使用教程 二、然后需要包管理工具。node 默认包含 npm,但也可以选择其他方案&a…

eclipse-安装WindowBuilder,怎么安装

WindowBuilder是Eclipse的一个插件,可以帮助开发者使用Java Swing、JavaFX和SWT快速构建图形用户界面(GUI)。下面是WindowBuilder的安装步骤: 1. 打开Eclipse IDE(请确保已安装JDK)。 2. 点击“Help”菜单…

【MySQL】:表的删除和修改

表的删除和修改 一.update(修改)二.delete(删除)1.删除数据2.截断表 三.插入查询的数据四.聚合函数五.group by 句子的使用1.导入表2.进行操作 一.update(修改) 对查询到的结果进行列值更新 下面有一个表,接下来的操作都是对该表进行操作。 1.将孙悟空同学的数学成绩…

目标跟踪 MOT数据集和可视化

目录 MOT15数据集格式简介 gt可视化 本人修改的GT可视化代码: MOT15数据集格式简介 以下内容转自:【目标跟踪】MOT数据集GroundTruth可视化-腾讯云开发者社区-腾讯云 MOT15数据集下载:https://pan.baidu.com/s/1foGrBXvsanW8BI4eybqfWg?…

100GPTS计划-AI写诗PoetofAges

地址 https://chat.openai.com/g/g-Cd5daC0s5-poet-of-ages https://poe.com/PoetofAges 测试 创作一首春天诗歌 创作一首夏天诗歌 创作一首秋天诗歌 创作一首冬天诗歌 微调 诗歌风格 语气:古典 知识库

嵌入式Linux开发板硬件学习-基于cadence

嵌入式Linux开发板硬件学习-基于cadence 目录原理图网表输出功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创…

本章主要介绍Spring Framework中用来处理URI的多种方式

1.使用 UriComponentsBuilder 构建URi 话不多说 直接上代码 UriComponents uriComponents UriComponentsBuilder.fromUriString("https://example.com/hotels/{hotel}").queryParam("q", "{q}").encode().build();URI uri uriComponents.exp…

js传递json数据过大的解决方案

protobufjs 使用protobuf,定义如下结构 Person.protobuf syntax "proto3";message Person {string name 1;int32 age 2; }Person.thrift namespace java com.example.Personstruct Person {1: required string name,2: required i32 age }使用bench…

Android笔记(十八):面向Compose组件结合Retrofit2和Rxjava3实现网络访问

一、Retrofit2 Square公司推出的Retrofit2库(https://square.github.io/retrofit/),改变了网络访问的方式。它实现了网络请求的封装。Retrofit库采用回调处理方式,使得通过接口提交请求和相应的参数的配置,就可以获得…
最新文章