python 实现链表

news2025/1/12 1:10:45

链表基础知识

链表是在物理内存中不连续,数据通过链表中的指针来链接到下一个元素。

链表由一系列节点组成,节点在运行时动态生成,节点一般包括两个部分:存储数据的数据域,存储下一个节点的指针域

链表的常用操作:节点的插入和删除。节点一般包括一个根节点,其他节点都是根据根节点生成。

单链表

# 链表的创建
#第一次加入加入节点,链表为空 ,第二次加入节点,先找到原有链表的最后一个节点
# 怎么判断到最后一个节点,但节点指向为空的时候则判断该节点为最后一个节点

# 节点类
class ListNode:
    def __init__(self,val=0,next=None):
        self.val=val
        self.next=next

class LinkedList:
    # 初始化
    def __init__(self):
        self.head=None  #头节点指向为空

    # 创建一个链表
    def create(self,data):
        self.head=ListNode(0)  #定义一个头节点
        cur=self.head
        for i in range(len(data)):
            node=ListNode(data[i])  #一个新的节点
            cur.next=node  #头节点指向新的节点
            cur=cur.next  #更新
    # 获取链表的长度
    def length(self):
        count=0
        cur=self.head  #当前节点
        while cur: #遍历节点,当节点为None的时候表示当前节点为空
            count+=1
            #更新节点
            cur=cur.next
        return count
    # 添加元素
    def insert(self,index,val):
        #在头部 尾部 中间添加
        #首先定义一个新的节点
        node=ListNode(val)

        if index==0:
            #表示在头部插入元素
            node.next=self.head
            self.head=node
        elif index==self.length()-1:
            # 表示在尾部插入元素
            #定义一个指针表示当前节点
            cur=self.head #当前节点从头节点开始
            while cur.next:
                cur=cur.next
            cur.next=node
        elif index>0 and index<self.length()-1:
            #在中间插入节点
            cur=self.head
            count=0
            while cur and count<index-1: #当前节点不是尾节点
                count+=1
                cur=cur.next
            node.next=cur.next
            cur.next=node
        else:
            print('插入位置超出索引')

    #删除元素
    def remove(self,index):
        pass
    #修改元素
    def change(self,index,val):
        pass
    #打印链表
    def display(self):
        cur=self.head
        count=0
        while cur:
            print('第{}个节点,值为{}'.format(count,cur.val))
            count+=1
            cur=cur.next
          
# 链表的创建
#第一次加入加入节点,链表为空 ,第二次加入节点,先找到原有链表的最后一个节点
# 怎么判断到最后一个节点,但节点指向为空的时候则判断该节点为最后一个节点

# 节点类
class ListNode:
    # 定义节点类,包含数据域和指针域
    def __init__(self,data=None,next=None):
        self.data=data #节点的数据域
        self.next=next  #指向下一个节点的指针

class LinkedList:
    # 初始化
    def __init__(self):
        self.head=None  #头节点指向为空
    # 创建一个链表
    def create(self,data):
        self.head=None  #定义一个头节点
        current=self.head  #当前节点
        #遍历data,给每一个节点赋值,并且指向下一个节点
        for _ in data:
            #创建一个新的节点类
            node=ListNode(_)
            if current is None:
                #如果当前节点是空,表示是头节点为空
                current=self.head=node
            else:
                current.next=node
                current=current.next
        return self.head
    #打印链表的长度
    def Len_Link(self):
        count=0
        current=self.head
        while(1):
            if current is not None:  #判断是不是尾节点,如果不是则链表长度加1
                count+=1
                current=current.next
            else:
                break
        # print('共有{}个节点'.format(count))
        return count
    #打印链表
    def display(self):
        print('开始打印链表')
        current=self.head
        count=0
        while current:
            count+=1
            print("第{}个节点".format(count),current.data)
            current=current.next

    #插入一个节点
    def insert(self,index,data):
        lenth=self.Len_Link()
        node=ListNode(data)
        current=self.head
        if index==0+1:
            #插入头节点
            if current :
                #头节点不为空
                node.next=current
                self.head=node
            else:
                #头节点为空
                self.head=node

        elif index==lenth+1:
            #在尾部插入节点
            while current:
                if current.next is None:
                    current.next=node
                    break
                else:
                    current = current.next

        elif index<=lenth and index>0:
            count=0
            while current:
                count+=1
                if count==index:
                    node.next=current.next
                    current.next=node
                    break
                else:
                    current=current.next
        return self.head

    def remove(self,index):
        #删除一个节点
        #删除头节点
        lenth=self.Len_Link()
        current=self.head
        if index==1:
            if current is None:
                pass
            else:
                current=current.next
                self.head=current
        else:
            #删除尾节点
            count=0
            while current:
                count+=1
                if count==index-1:
                    current.next=None
                    break
                else:
                    current=current.next
        return self.head


if __name__=='__main__':
    data=[1,2,3,4]
    #定义一个链表
    a=LinkedList()
    a.create(data)
    #打印一个链表
    a.display()
    #链表的长度
    a.Len_Link()
    #插入一个节点
    a.insert(3,15)
    a.display()
    #插入一个节点
    a.insert(1,10)
    a.display()

    #定义一个空链表
    a=LinkedList()
    a.insert(1,100)
    a.display()
    #在尾部插入一个节点
    a.insert(2,1000)
    a.display()

    a.insert(1,10)
    a.display()


    #删除头部节点
    a.remove(1)
    a.display()

    #删除尾部节点
    a.remove(2)
    a.display()

 

参考:

链表基础知识详解(非常详细简单易懂)-CSDN博客

链表python基础知识_python链表长度-CSDN博客

Python编写单链表_python 单链表是什么-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Docker安装部署Swagger Editor并远程访问编辑API文档

文章目录 Swagger Editor本地接口文档公网远程访问1. 部署Swagger Editor2. Linux安装Cpolar3. 配置Swagger Editor公网地址4. 远程访问Swagger Editor5. 固定Swagger Editor公网地址 Swagger Editor本地接口文档公网远程访问 Swagger Editor是一个用于编写OpenAPI规范的开源编…

基于pyltp的依存句法分析

代码是两年多前网上找的&#xff0c;能运行。先记在这里&#xff0c;以防以后用到 import os from pyltp import Segmentor, Postagger, Parser, NamedEntityRecognizer, SementicRoleLabeller # pip install pyltp -i https://pypi.tuna.tsinghua.edu.cn/simple 可以先下载好…

Shopee买家通系统,智能下单新体验

Shopee买家通系统带来了一场智能下单的革命&#xff0c;为用户提供了更便捷的购物体验。通过简单的准备工作&#xff0c;您即可使用该系统完成自动下单&#xff0c;省去繁琐步骤&#xff0c;轻松实现购物愉悦。 账号准备&#xff0c;注册无忧 首先&#xff0c;准备一个具备下单…

C++的编译链接

文章目录 1、前置条件2、预处理/预编译2、编译3、汇编5、链接 1、前置条件 # 操作系统版本 cat /proc/version Linux version 3.10.0-1160.95.1.el7.x86_64 (mockbuildkbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Mon Jul 24 …

iOS 开发高效率工具包:10 大必备工具

​ 作为 iOS 开发人员&#xff0c;拥有合适的工具可以极大地提高您的工作效率和工作质量。无论您是刚刚起步还是已经开发 iOS 应用程序多年&#xff0c;以下是每个 iOS 开发人员都应该了解的 10 大必备工具。 让我们开始 Xcode Xcode 是用于 iOS 开发的官方 IDE&#xff08;…

JavaScript中的for循环你用对了吗?

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;JavaScript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript-for循环 目录 循环结构 循环思想&#xff08;三要素&#xff09; 实现…

ElasticSearch知识体系详解

1.介绍 ElasticSearch是基于Lucene的开源搜索及分析引擎&#xff0c;使用Java语言开发的搜索引擎库类&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是当前流行的企业级搜索引擎。 它可以被下面这样准确的形容&#xff1a; 一个分布式的实时文档存储&#xf…

CSS特效023:文字聚光灯效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…

LoadRunner性能测试从零开始

目录 第1章 软件性能测试 1.1 什么是软件的性能 1.1.1 软件 1.1.2 软件性能的产生 1.1.3 功能与性能的关系 1.1.4 用户眼里的软件性能 1.1.5 软件人员眼里的软件性能 1.1.6 以空间换时间 1.1.7&#xff0e;以时间换空间 1.2 软件性能测试 1.2.1 性能测试在软…

EI级 | Matlab实现TCN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测

EI级 | Matlab实现TCN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测 目录 EI级 | Matlab实现TCN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【EI级】Matlab实现TCN-LSTM-Multihead-Attent…

解决错误代号0x80240438丢失的全面指南,分析0x80240438错误问题

在使用电脑的过程中&#xff0c;我们常常遇到一些复杂的问题&#xff0c;并期待找到最佳解决方案。其中&#xff0c;与“0x80240438”相关的问题是一个值得深入探讨的主题。今天就和大家探讨错误代码0x80240438的问题&#xff0c;都有什么解决办法有效的解决错误代码0x80240438…

Everything结合内网穿透搭建在线资料库并实现随时随地远程访问

Everythingcpolar搭建在线资料库&#xff0c;实现随时随地访问 文章目录 Everythingcpolar搭建在线资料库&#xff0c;实现随时随地访问前言1.软件安装完成后&#xff0c;打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 前…

必须收藏!十五个设计灵感网站

设计师必备的灵感网站是每个设计师都应该关注的一部分。它们是设计师在设计过程中获得灵感和创造力的好地方。 在这里&#xff0c;我将介绍一些值得关注的灵感网站&#xff0c;涵盖不同类型的设计&#xff0c;包括UI设计、平面设计、网站设计等。我希望这些网站能给你带来一些…

【Android】使用intent.putExtra()方法在启动Activity时传递数据

食用方法 在Android中&#xff0c;你可以使用Intent对象来在启动Activity时传递数据。以下是一个示例&#xff0c;展示了如何在startActivity时传递数据到被启动的Activity&#xff1a; 在启动Activity的地方&#xff0c;创建一个Intent对象&#xff0c;并使用putExtra()方法…

【HTTP协议】简述HTTP协议的概念和特点

&#x1f38a;专栏【网络编程】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f970;欢迎并且感谢大家指出小吉的问题 文章目录 &#x1f33a;概念&#x1f33a;特点&#x1f384;请求协议&#x1f384;响应协议…

Spinnaker 基于 jenkins 触发部署

jenkins job 触发部署 将 Jenkins 设置为 Spinnaker 中的持续集成 (CI) 系统可让您使用 Jenkins 触发管道、向管道添加 Jenkins 阶段或向管道添加脚本阶段。 前置要求&#xff1a; 已在kubernetes中部署spinnaker已准备可用的jenkins实例 启用 jenkins触发器 官方文档&…

洛谷 [AGC032B] Balanced Neighbors

分析 首先明确图的定义&#xff0c;图点集边集&#xff0c;其中点必须要有一个&#xff0c;图不可以是空图。&#xff08;虽然和这道题没关系&#xff09; 正着想不明白那就反着来&#xff08;正难则反&#xff09;。 假设目前所有边都是连上的&#xff0c;可以发现每个点的…

【渗透】记录阿里云CentOS被渗透攻击

文章目录 发现排查安装Nethogs查询情况 最终方案 发现 流量异常&#xff0c;出现大流量&#xff0c;网络贷带宽占满情况 排查 安装Nethogs 1.1 Nethogs介绍 NetHogs是一个开源的命令行工具&#xff08;类似于Linux的top命令&#xff09;&#xff0c;用来按进程或程序实时统…

C语言-指针讲解(4)

在上一篇博客中&#xff1a; C语言-指针讲解(3) 我们给大家介绍了指针进阶的用法 让下面我们来回顾一下讲了什么吧&#xff1a; 1.字符指针变量类型以及用法 2.数组指针本质上是一个指针&#xff0c;里面存放数组的地址。而指针数组本质上是个数组&#xff0c;里面存放的是指针…

【带头学C++】----- 九、类和对象 ---- 9.1 类和对象的基本概念----(9.1.1---9.1.3)

目录 9.1 类和对象的基本概念 9.1.1 类的封装性 9.1.2 定义类的步骤和方法 9.1.3 设计一个学生类 Student 9.1 类和对象的基本概念 9.1.1 类的封装性 类是一种用户自定义的数据类型&#xff0c;它定义了一组数据成员和成员函数。类可以看作是一个模板或者蓝图&#xff0c;用…