Python单向链表操作

news2024/12/27 2:06:59

目录

一、单向链表

单向链表示例图

 二、单向链表的操作

1、判断链表是否为空

2,链表长度

3,遍历整个链表

4,在链表头部添加元素

5、链表尾部添加元素

6,在指定位置插入元素

7,修改指定位置的元素

8,删除元素

9、查找元素是否存在

三、完整代码


一、单向链表

单向链表示例图

结点node里有两个部分:elem(元素)和next(指向下一结点的指针),head指针指向头结点

 二、单向链表的操作

1、判断链表是否为空

    def is_empty(self):
        """判断链表是否为空"""
        if self.__head is None:
            return True
        else:
            return False

2,链表长度

只要当前的指针不指向None,每次遍历就加1

    def length(self):
        """链表长度"""
        count = 0
        cur = self.__head
        while cur is not None:
            count += 1
            cur = cur.next
        return count    

3,遍历整个链表

    def travel(self):
        """遍历整个链表"""
        cur = self.__head
        while cur is not None:
            print(cur.elem, end=' ')
            cur = cur.next
        print('')

4,在链表头部添加元素

    def add(self, item):
        """链表头部添加元素"""
        node = Node(item)
        if self.is_empty():
            self.__head = node
        else:
            # 新来的节点的next指向第一个节点
            node.next = self.__head
            # 再改变第一个节点的指针指向新节点
            self.__head = node

5、链表尾部添加元素

    def append(self, item):
        """链表尾部添加元素"""
        # 创建新结点
        node = Node(item)
        # 是空链表就把头节点指向这个节点
        if self.is_empty():
            self.__head = node
        else:
            cur = self.__head
            while cur.next is not None:
                cur = cur.next
            cur.next = node

6,在指定位置插入元素

遍历找到要插入位置的前一个结点

修改前一个结点与新插入结点的指针指向

再修改新插入结点的指针与后一个结点的指针指向

    def insert(self, pos, item):
        """在指定位置插入元素"""
        # 位置pos在第一个元素之前,则在头部插入
        if pos <= 0:
            self.add(item)
        # 位置pos大于总长度,则在尾部插入
        elif pos > self.length():
            self.append(item)
        else:
            # 指定位置添加元素
            node = Node(item)
            count = 0
            pre = self.__head
            # 循环定位指针位置
            while count < (pos-1):
                count += 1
                pre = pre.next
            node.next = pre.next
            pre.next = node

7,修改指定位置的元素

    def modify(self, pos, item):
        """修改指定位置的元素"""
        # 位置pos小于等于0时,则修改头部元素
        if pos <= 0:
            self.__head.elem = item
        # 位置pos大于总长度,则修改尾部元素
        elif pos >= self.length():
            pre = self.__head
            # 循环指针找到尾部元素
            while pre is not None:
                if pre.next is None:  # pre.next为None说明已经找到尾部元素了
                    pre.elem = item
                    break
                else:
                    pre = pre.next  # 不是尾部元素就继续指针指向下一个
        else:
            count = 0
            pre = self.__head
            # 循环找出位置
            while count < pos:  # 1.当不满足count < pos条件时,说明指针已经指向了给定pos的位置
                count += 1
                pre = pre.next
            pre.elem = item  # 2.修改元素

8,删除元素

    def remove(self, item):
        """删除节点"""
        cur = self.__head
        pre = None
        while cur is not None:
            # 找到了要删除的元素
            if cur.elem == item:
                # 要删除的元素就是第一个元素,就把头指针指向当前的下一个节点
                if not pre:
                    self.__head = cur.next
                else:
                    pre.next = cur.next
                break
            # 未找到要删除的元素,指向向后走,继续遍历
            else:
                pre = cur
                cur = cur.next

9、查找元素是否存在

    def search(self, item):
        """查找节点是否存在"""
        cur = self.__head
        while cur is not None:
            # 找到了返回True,未回到指向下一个继续遍历
            if cur.elem == item:
                return True
            cur = cur.next
        return False

三、完整代码

具体说明都在注释里

class Node():
    def __init__(self, elem):
        # 单链表结点
        self.elem = elem
        self.next = None


class SingleLinkList():
    def __init__(self, node=None):
        self.__head = node

    def is_empty(self):
        """判断链表是否为空"""
        if self.__head is None:
            return True
        else:
            return False

    def length(self):
        """链表长度"""
        count = 0
        cur = self.__head
        while cur is not None:
            count += 1
            cur = cur.next
        return count

    def travel(self):
        """遍历整个链表"""
        cur = self.__head
        while cur is not None:
            print(cur.elem, end=' ')
            cur = cur.next
        print('')

    def add(self, item):
        """链表头部添加元素"""
        node = Node(item)
        if self.is_empty():
            self.__head = node
        else:
            # 新来的节点的next指向第一个节点
            node.next = self.__head
            # 再改变第一个节点的指针指向新节点
            self.__head = node

    def append(self, item):
        """链表尾部添加元素"""
        # 创建新结点
        node = Node(item)
        # 是空链表就把头节点指向这个节点
        if self.is_empty():
            self.__head = node
        else:
            cur = self.__head
            while cur.next is not None:
                cur = cur.next
            cur.next = node

    def insert(self, pos, item):
        """在指定位置插入元素"""
        # 位置pos在第一个元素之前,则在头部插入
        if pos <= 0:
            self.add(item)
        # 位置pos大于总长度,则在尾部插入
        elif pos > self.length():
            self.append(item)
        else:
            # 指定位置添加元素
            node = Node(item)
            count = 0
            pre = self.__head
            # 循环定位指针位置
            while count < (pos-1):
                count += 1
                pre = pre.next
            node.next = pre.next
            pre.next = node

    def modify(self, pos, item):
        """修改指定位置的元素"""
        # 位置pos小于等于0时,则修改头部元素
        if pos <= 0:
            self.__head.elem = item
        # 位置pos大于总长度,则修改尾部元素
        elif pos >= self.length():
            pre = self.__head
            # 循环指针找到尾部元素
            while pre is not None:
                if pre.next is None:  # pre.next为None说明已经找到尾部元素了
                    pre.elem = item
                    break
                else:
                    pre = pre.next  # 不是尾部元素就继续指针指向下一个
        else:
            count = 0
            pre = self.__head
            # 循环找出位置
            while count < pos:  # 1.当不满足count < pos条件时,说明指针已经指向了给定pos的位置
                count += 1
                pre = pre.next
            pre.elem = item  # 2.修改元素

    def remove(self, item):
        """删除节点"""
        cur = self.__head
        pre = None
        while cur is not None:
            # 找到了要删除的元素
            if cur.elem == item:
                # 要删除的元素就是第一个元素,就把头指针指向当前的下一个节点
                if not pre:
                    self.__head = cur.next
                else:
                    pre.next = cur.next
                break
            # 未找到要删除的元素,指向向后走,继续遍历
            else:
                pre = cur
                cur = cur.next

    def search(self, item):
        """查找节点是否存在"""
        cur = self.__head
        while cur is not None:
            # 找到了返回True,未回到指向下一个继续遍历
            if cur.elem == item:
                return True
            cur = cur.next
        return False


if __name__ == '__main__':
    ll = SingleLinkList()
    print(ll.is_empty())
    print(ll.length())
    ll.travel()

    print('append')
    ll.append(10)
    ll.append(12)
    ll.travel()

    print('add')
    ll.add(9)
    ll.travel()

    print('insert')
    ll.insert(1, 33)
    ll.travel()

    print('remove')
    ll.remove(9)
    ll.travel()

    print('modify')
    ll.modify(-1, 13)
    ll.travel()
    ll.modify(10, 44)
    ll.travel()
    ll.modify(1, 55)
    ll.travel()

    print('search')
    print(ll.search(12))

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

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

相关文章

可视化Echarts中title、tooltip、legend、grid属性的常用设置

title中常用的设置 配置项--tooltip ​编辑 配置项--legend 配置项--grid title中常用的设置 title 标题组件&#xff0c;包含主标题和副标题。 以下是常用的对标题的设置 title:{//设置图表的标题text:"主标题",link:"baidu.com", //设置标题超链接…

详解C语言string.h中常见的14个库函数(三)

本篇博客继续讲解C语言string.h头文件中的库函数。本篇博客计划讲解3个函数&#xff0c;分别是&#xff1a;strstr, strtok, strerror。其中strstr函数我会用一种最简单的方式模拟实现。 strstr char * strstr ( const char * str1, const char * str2 );strstr可以在str1中查…

用yolov5+playwright过滑动验证码

目录 梳理思路 训练模型 编写代码 总结与提高 源码下载 在上一节&#xff0c;我们通过opencv-pythonplaywright成功过掉了QQ空间的滑动验证码。在本节&#xff0c;我们将使用yolov5playwright来实现相同效果。 注&#xff1a;因为yolov5的配置教程网上已经很多了&#xff…

C++初阶之函数重载

目录 前言 函数重载 1.函数重载的概念 2.C支持函数重载的原理--名字修饰(name Mangling) 前言 今天小编给大家带来的是C中关于函数重载的内容&#xff0c;和C语言不一样&#xff0c;函数重载是C语言特有的&#xff0c;那么该功能实现的底层原理是什么呢&#xff1f;请大家…

Idea配置maven,指定settings.xml文件不生效

一.简介 最近单位要求把项目的仓库配置从阿里云改为nexus私服&#xff0c;配置了一个settings-nexus.xml的配置文件&#xff0c;idea的maven配置指定了该settings-nexus.xml文件&#xff0c;发现走的还是阿里云的&#xff0c;新的settings-nexus.xml竟然不生效&#xff0c;依赖…

分支和循环语句(1)

文章目录 目录1. 什么是语句2. 分支语句&#xff08;选择结构&#xff09;2.1 if语句2.1.1 悬空else2.1.2 if书写形式的对比2.1.3 练习 2.2 switch语句2.2.1 在switch语句中的 break2.2.2 default子句2.2.3 练习 3. 循环语句3.1 while循环3.1.1 while语句中的break和continue 附…

记一次fastjson反序列化到内网靶标

声明&#xff1a;文中涉及到的技术和工具&#xff0c;仅供学习使用&#xff0c;禁止从事任何非法活动&#xff0c;如因此造成的直接或间接损失&#xff0c;均由使用者自行承担责任。 点点关注不迷路&#xff0c;每周不定时持续分享各种干货。 众亦信安&#xff0c;中意你啊&a…

多种方法解决This is usually caused by another repository pushing to the same ref的错误

文章目录 1. 复现错误2. 分析错误3. 解决错误4. 解决该错误的其他方法 1. 复现错误 今天使用git status查看文件状态&#xff0c;发现有一个文件未提交&#xff0c;如下代码所示&#xff1a; D:\project\test>git status On branch master Your branch is up to date with …

sftp常用命令介绍

sftp常用命令&#xff1a; 1. sftp 登录sftp服务器 sftp userip ​​​​​​ 如需要看全部命令&#xff1a;则使用help即可 2. pwd和lpwd 、 ls和lls 、cd和lcd 等 sftp登录之后默认操作是远程服务器&#xff0c;当需要操作本地时&#xff0c;就需要在前边加“l”&#…

【wpf踩坑日记】搞错了,眼睛问题(:))

背景 今天遇到一个草鸡奇葩的问题&#xff1a; ComboBox 选择时 没有触发绑定的属性的set。 其实看错了&#xff0c;Mode写出OneWay&#xff0c;应该是TowWay。 不然是会触发set的。兄弟们不用往下看了。。。。。 哎&#xff0c;有的时候就会碰到这种情况&#xff0c;我还…

Ubuntu上跑通PaddleOCR

书接上文。刚才说到我已经在NUC8里灌上了Windows Server 2019。接下来也顺利的启用了Hyper-V角色并装好了一台Ubuntu 22.04 LTS 的虚机。由于自从上回在树莓派上跑通了Paddle-Lite-Demo之后想再研究一下PaddleOCR但进展不顺&#xff0c;因此决定先不折腾了&#xff0c;还是从x6…

python常见问题总结

对于长期深耕在python爬虫的程序员来说&#xff0c;如何快速解决代码中的问题它是作为合格的程序员应该具备的基本素质。下面将我总结整理出有关python的一些常见问题记录下来方便后期查证。 Python python 没有多态&#xff0c;而是鸭子类型 多继承&#xff0c;没有接口&…

【操作系统】CPU 缓存一致性

【操作系统】CPU 缓存一致性、MESI 协议 参考资料&#xff1a; CPU缓存一致性协议(MESI) 【JUC】Java并发机制的底层实现原理 CPU 缓存一致性 文章目录 【操作系统】CPU 缓存一致性、MESI 协议CPU Cache 的数据写入写直达写回 缓存一致性问题总线嗅探MESI 协议总结 CPU Cache …

springboot:缓存不止redis,学会使用本地缓存ehcache

0. 引言 随着redis的普及&#xff0c;更多的同学对redis分布式缓存更加熟悉&#xff0c;但在一些实际场景中&#xff0c;其实并不需要用到redis&#xff0c;使用更加简单的本地缓存即可实现我们的缓存需求。 今天&#xff0c;我们一起来看看本地缓存组件ehcache 1. ehcache简…

python+vue 市政工程资源互助平台的设计与实现

该系统将由用户系统&#xff0c;管理员系统两部分组成。用户有个人和vip两种类型。 用户模块包括登录注册功能&#xff0c;登录字段包括用户名&#xff0c;密码&#xff0c;用户身份以及验证码。注册包括用户名&#xff0c;密码&#xff0c;邮箱&#xff0c;电话号码&#xff0…

vite+vue+element-plus完成一个admin管理后台

整体项目的 访问链接&#xff1a;https://bigmiss.top/demo/index.html 用到的技术整理 名称版本安装命令说明vite4.0.0npm init vitelatest构建Vue项目vue3.2.45npm install vuenext渐进式框架&#xff08;在vite已安装&#xff09;element-plus3.7.5npm install element-plu…

C#调用C++封装的SDK库(dll动态库)——下

C#调用C封装的SDK库(dll动态库)——下 一、说明 上一篇我们相当于封装的是C语言风格的动态dll库&#xff0c;供C#来调用的。 C#调用C封装的SDK库(dll动态库)——上 如果我们要封装的是下面的类呢&#xff1f;我们该怎么办&#xff1f;大家先思考下。 class Calculation { p…

Tomcat常用操作

Tomcat时间长不用&#xff0c;居然不会用了&#xff0c;这里用的Tomcat9.0.74&#xff0c;对应的jdk版本是jdk8与jdk11。 先看他的把Tomcat安装上去&#xff1a;Tomcat9的安装 运行与关闭Tomcat winr输入cmd。在运行窗口输入startup.bat&#xff0c;回车&#xff0c;启动Tom…

Java基础:对象的克隆(复制)

假如想复制一个简单变量。很简单&#xff1a; int apples 5; int pears apples; 不仅int类型&#xff0c;其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况。 但是如果你复制的是一个对象&#xff0c;情况就复杂了。 假设说我是一个b…

webpack----开发服务器

文章目录 devServer抽取csscss的兼容性压缩cssjs语法检查js的兼容性 devServer 每次编辑源码后&#xff0c;都要webpack重新打包&#xff0c;才能看到效果&#xff0c;麻烦&#xff01;使用webpack-dev-server 自动打包编译源码配置 // webpack.config.js ... mode: "de…