python实现单向循环链表 判空 长度 遍历 头插 尾插 插入 删除 范围查询 反转

python实现单链表 判空 长度 遍历 头插 尾插 插入 删除 范围查询 反转 提示: 是我尝试去复习的过程中, 思路的步骤, 看起来有点像草稿, 后期如果有空加上文字描述说明我的思考过程 在网上看了一些别的实现思路, 我觉得最难的其实是怎么去 抽象 我们要描述的 链表 等数据结构对象, 把它们根据在 内存中实际的存储方式 进行抽象. 这里最终是抽象成 Node 和 SingleLinkList 两个对象, 前者作为后者的 一个属性, 这属于 面向对象的多态. 最终, 暴露... 阅读详情


class Node(object):
    """定义节点"""

    def __init__(self, obj):
        self.data = obj
        self.next = None


class CycleLinkList(object):
    """单向循环链表"""

    def __init__(self):
        self._head = None

    def is_empty(self):
        """是否为空"""
        return self._head is None

    def length(self):
        """单向循环链表的 长度"""
        cur = self._head
        if cur is None:
            return 0

        count = 1
        while cur.next != self._head:
            count += 1
            cur = cur.next

        return count

    def travel(self):
        """单向循环链表 遍历"""
        cur = self._head
        if cur is None:
            print()

        while cur.next != self._head:
            print(cur.data, end=" ")
            cur = cur.next
        # 打印尾节点
        print(cur.data)

    def add(self, obj):
        """单向循环链表 头插法"""
        node = Node(obj)

        cur = self._head
        if cur is None:
            node.next = node

        while cur.next != self._head:
            cur = cur.next

        node.next = self._head
        cur.next = node
        self._head = node

    def append(self, obj):
        """单向循环链表 尾插法"""
        node = Node(obj)

        cur = self._head
        if cur is None:
            node.next = node

        while cur.next != self._head:
            cur = cur.next

        cur.next = node
        node.next = self._head

    def insert(self, index, obj):
        """单向循环链表 插入"""

        assert isinstance(index, int)
        if index <= 0:
            self.add(obj)
        elif index >=self.length():
            self.append(obj)
        else:
            # 说明是在中间插入
            node = Node(obj)
            cur = self._head
            for i in range(index - 1):
                cur = cur.next
            node.next = cur.next
            cur.next = node

    def remove(self, obj):
        """单向循环链表 移除"""
        cur = self._head

        if cur is None:
            raise ValueError("%s does not exist" % obj)
        # 如果是单个节点
        if cur.next == self._head:
            if cur.data == obj:
                self._head = None
            else:
                raise ValueError("%s does not exist" % obj)

        # 难点: 删除的是头结点
        if cur.data == obj:
            # 遍历找到尾节点
            while cur.next != self._head:
                cur = cur.next
            cur = self._head.next
            self._head = self._head.next
            # 对于c程序老说, 这里还有做一个内存回收

        while cur.next != self._head:
            pre = cur
            cur = cur.next
                
            if cur.data == obj:
                pre.next = cur.next
                break
        else:
            raise ValueError("%s does not exist" % obj)
    
    def search(self, obj):
        """单向循环链表 范围查询"""
        cur = self._head
        
        if cur is None:
            return False
        
        while cur.next != self._head:
            if cur.data == obj:
                return True
            cur = cur.next
        else:
            if cur.data == obj:
                return True
            else:
                return False
    
    def reverse(self):
        """单向循环链表 反转"""
        # TODO 此坑待填


if __name__ == '__main__':
    cll = CycleLinkList()
    print(cll.is_empty())  # True
    print(cll.length())  # 0

    cll.add(100)
    print(cll.is_empty())  # False
    print(cll.length())  # 1
    cll.travel()  # 100

    cll.add(200)
    print(cll.length())  # 2
    cll.travel()  # 200 100

    cll.add(300)
    cll.travel()  # 300 200 100

    cll.append(400)
    cll.travel()  # 300 200 100 400

    cll.insert(0, 500)
    cll.travel()  # 500 300 200 100 400

    cll.insert(10, 600)
    cll.travel()  # 500 300 200 100 400 600

    cll.insert(2, 700)
    cll.travel()  # 500 300 700 200 100 400 600

    cll.remove(500)
    cll.travel()  # 300 700 200 100 400 600

    cll.remove(600)
    cll.travel()  # 300 700 200 100 400

    cll.remove(200)
    cll.travel()  # 300 700 100 400

    print(cll.search(100))  # True
    print(cll.search(800))  # False




链表的初始化、遍历、删除、插入、判断是否为空、求长度 C语言实现 #include #include #include typedef struct Node { int data; struct Node *PNext; } NODE,*PNODE; PNODE Init(); void Traverse(PNODE pHead); bool Insert(PNODE pHead,int pos,int val); bool Dele 阅读详情

相关推荐

爬虫等数据去重方案: 摘要算法 Simhash 布隆过滤器

1. 去重的应用场景和基本原理 1.1 场景引入思考: 1.防止发送重复的请求 2.防止保存重复的数据 原理:一致, 对二进制字符串去重 1.2 基本原理: 思考: 明确 数据构成类型(字符串, 数字 , 对象, 特殊字符…) ==> 来制定去重方案 判断依据: 什么样的数据算作重复数据? 总结: ​ 根据给定的 [判断依据] 和 [去重容器], 将原始数据逐一进行判断, 判...

DefaultTest的 编程试验场 2177

各类链表判空条件

——> 转自原博客 1.单链表 带头结点: 分析: 带有头节点的链表若为空,只需要整条链表只剩一个头节点 [这是和不带头节点的链表的一个很大的区别(不带头结点的链表若要为空,整个链表不能存在一个结点)], 怎样使带头节点的链表只剩一个头节点呢? 只需要第一个存储数据的节点不存在即可,即头节点的后继结点不存在即可 所以只需要头节点的next指针域不存在即可(实质上使指向NULL) 所以 带头点的单链表的判空条件为 head->next=NULL 不带头结点: 分析: 若要不带头结点的链表为空,

abcdeasdfas的博客 1万+

单链表基本操作:建立链表,判空,求表长等

实现单链表的基本操作:建立链表,判空,求表长等

判断链表为空的三种情况

(1)带头结点单链表:head->next==NULL; (2)带头结点循环链表:head->next==head; (3)不带头结点单链表:head==NULL;

W8Z8M的博客 1万+

ubuntu安装eigen3.3.7

查看已安装版本: gedit /usr/include/eigen3/Eigen/src/Core/util/Macros.h 或 gedit /usr/local/include/eigen3/Eigen/src/Core/util/Macros.h 卸载先前版本: sudo updatedb locate eigen3 得到eigen库的位置 卸载: sudo rm -rf /usr/include/eigen3 /usr/lib/cmake/eigen3 ...

reason的博客 1万+

从零到一:用ROS2和Gazebo搭建Franka机械臂仿真环境(避坑指南)

本文详细介绍了如何使用ROS2和Gazebo从零开始搭建Franka机械臂的仿真环境,包括环境准备、ROS2包安装、控制器配置及常见问题解决方案。特别针对关节位置控制等核心功能提供了实用代码示例和避坑指南,帮助开发者高效构建机器人算法验证平台。

weixin_29061465的博客 458

数据结构之循环链表

普通单双链表和循环单双链表的区别;循环单双链表的基本操作(定义,初始化,插入,删除,判空)

m0_64365419的博客 1402

海康视觉平台VisionMaster实战入门:从通讯配置到工具应用

本文为海康VisionMaster视觉平台实战入门指南,详细介绍了从软件安装准备、与PLC等外部设备的通讯配置,到匹配定位、测量、畸变矫正等核心工具的应用方法。通过实战案例拆解,帮助工程师快速掌握如何搭建完整的机器视觉检测与引导定位系统,实现工业自动化项目落地。

weixin_29224309的博客 1006

【C语言】基本数据结构-单链表

本文主要描述了链表的优势,以及支持操作的具体使用。

weixin_43949948的博客 1323

【LangChain编程:从入门到实践】实现多模态代理

【LangChain编程:从入门到实践】实现多模态代理 关键词:LangChain, 多模态代理, 自然语言处理, 机器学习, 知识图谱, 对话系统, 代码生成, AI代理 1. 背景介绍 随着人工智

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 579

MATLAB点云处理(八):为点云添加高斯噪声

本文对如何借助MATLAB,为点云添加高斯噪声做出了说明,并给出实现代码。

孙悟空 2844

数据结构——双向链表

尾结点的下一个是头结点,头结点的前一个是尾结点。对于尾插,可以看成在尾结点后插入,也可以看成在头结点(head)前插入,因为head的前驱结点就是尾。next是一个地址,=是赋值,改变指针的指向就是修改结构体内指针的值,也就是修改地址。初始化双链表就是开辟一个头结点并返回,只有一个结点时,链表的前一个和后一个都是自己。pos是一个结构体指针,插入是在pos前插入,删除就直接删除pos位置的结点。头删,即删除第一个结点,也就是头结点的下一个,但是不包括头结点。销毁时,遍历链表释放其余结点后,在释放头结点。

qq_74245477的博客 1298

基于STM32、HAL库的MCP4013T-103E/CH 数字电位器驱动程序设计

define MCP4013_I2C_ADDR (0x5F << 1) // HAL库使用7位地址左移1位,或直接使用0xBE/0xBF。#include "i2c.h" // 包含你的I2C初始化相关的头文件,例如由CubeMX生成的 i2c.h。大于127的值会被截断。// MCP4013的读操作:主机发起读取请求,从机返回当前滑片位置的一个字节。// 使用HAL_I2C_Master_Transmit直接发送数据。// 使用HAL_I2C_Master_Receive读取一个字节。

corlin6688的博客 126

【数据结构】链表 详解

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)

aliyonghang的博客 2408

以 DeleteRestrictions 与 inlineDelete 为核心的 Fiori Elements 表格删除机制全解

SAP Fiori elements 中删除操作的设计与实现涉及多维度考量。框架默认依据 OData 元数据判断删除能力,通过 DeleteRestrictions 注解实现行级条件控制(deletable-path)。表格支持两种删除模式:工具栏集中删除与响应式表格行内删除,但二者不建议混用。关键约束包括:行内删除仅适用于 Responsive Table,且与多选功能互斥。配置需遵循三层架构:后端能力注解、前端表格形态和运行时交互。设计上强调禁用优于隐藏的可用性原则,并需保持列表页与对象页的删除体验一致

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 152

AgentScope Java 2.0 项目实战:使用AgentScope Builder 构建企业级多租户 AI Agent 平台

本文基于 AgentScope Builder 源码深度分析,系统讲解多租户 AI Agent 构建平台的完整开发流程。涵盖 Spring Boot 3.x + WebFlux 后端架构、React 18 + TypeScript 前端实现、HarnessAgent 运行时、CompositeFilesystem 多租户隔离、SSE 流式对话、6 种 IM 渠道接入(钉钉/飞书/企微/GitHub/GitLab)、Git 与 Nacos 技能市场、JWT 认证、Docker Sandbox 隔离等核心技术。

program哲学 719

Python单向链表操作

Python单向链表操作

分享一点有用的知识 949

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java list 最后一个_怎样获取list集合中的最后一个对象中的值

展开全部指令:list.get(list.size()-1);C语言中List的含义:链表是一种物理存储单元上非连续、非顺32313133353236313431303231363533e78988e69d8331333365646263序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分...

weixin_31190007的博客 9226

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

单向不循环链表(创建、遍历、增、删、查找、判空)

# coding: utf-8 # 链表节点 class Node(object): def __init__(self, item): self.item = item self.next = None # 单向不循环链表 class LinkList(object): def __init__(self): self._h...

qq_21944445的博客 281

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

链表的常用算法(创建,判空,遍历…

链表的常用算法 # include # include # include //结构体 typedef struct Node {  int data;  struct Node * Next; }NODE, * PNODE; //函数声明 PNODE creat_list(void);//创建链表 void is_empty(PNODE);//判断链表是否为空 void traverse_li

Z_Blue_sky的专栏 924

如何判断一个链表是否为空?

L为指向表头结点的指针,分别写出带有头结点的单链表、单项循环链表和双向循环链表判空的条件单链表 NULL==L-&gt;next单向循环 L==L-&gt;next双向循环 L==L-&gt;next&amp;&amp;L==L-&gt;prior...

Cookie1997的小屋 2万+

单链表为空的判定条件

带头结点的单链表head为空的判定条件是()。 A.head==NULL B.head->next==NULL C.head->next==head D.head!=NULL 正确答案:B 解析:若单链表带头结点,那么判定它为空的条件是head->next==NULL;若单链表不带头结点,那么判定它为空的条件则是head==NULL。 ...

mxing5694270的博客 3万+

彻底搞清链表的判空条件

声明:以下头指针都是指向链表的第一个结点(有头节点就指向头结点,没有头节点就指向第一个存储数据的结点),并且默认一下头结点的数据域不存储数据信息 1、单链表 无头结点 分析:带有头节点的链表若为空,只需要整条链表只剩一个头节点,这是和不带头节点的链表的一个很大的区别(不带头结点的链表若要为空,整个链表不能存在一个结点),怎样使带头节点的链表只剩一个头节点呢?只需要第一个存储数据的节点不存在即可,即头节点的后继结点不存在即可,所以只需要头节点的next指针域不存在即可(实质上使指向NULL),所以带头点的

weixin_54793519的博客 1万+

单循环链表的初始化和判空

#include<stdio.h> #include<stdlib.h> #define OVERFLOW -2 #define FALSE 0 #define TRUE 1 #define OK 1 #define ERROR 0 typedef int Status; //链表元素的数据类型 typedef struct { char name[20]; flo...

AnalogElectronic的博客 2713

python求单链表的长度_2019.9.17-单向循环链表:遍历+求长度+添加元素(完整代码)...

# coding:utf-8class Node(object):"""節點0"""def __init__(self, elem):self.elem = elemself.next = None# node = None(100)class SingleLinkList(object):"""單向循環鏈表"""def __init__(self, node=None):self.__head ...

weixin_31966453的博客 689

Python+图解:实现数据结构中单链表的头插法和尾插法

用Python实现数据结构的头插法和尾插法 1.链表结构 # -*- coding:utf-8 -*- import random as rd class Node(): def __init__(self, value, next=None): self.value = value self.next = next 2.头插法 #头插法 def creatlist_head(n...

qq_39783265的博客 4056
上一篇: 数据结构与算法 :搜索算法之二分查找(递归 | 非递归) python实现
下一篇: 常用开发OS环境|软件工具安装方面的记录
DefaultTest
博客等级 码龄9年 45粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值