数据结构与算法-链表之单向循环链表

Python进阶 - 数据结构与算法 - 04 单向循环链表的操作 一、单向循环链表的引入 单向循环链表的结构 链表中的每一个节点都包括数据域和链接域两部分。数据域中存放真实的数据,链接域存放下一个数据的地址,且尾节点的链接域为首节点。 二、单向循环链表的操作 2.1 节点的实现 链表中的每一个数据都由数据区和链接域两部分组成,在Python或者其他语言中没有一个数据类型可以同时储存这两个数据,因此我们可以定义节点这样一个类,而节点中的数据和链接区可以想象成该类... 阅读详情

单向循环链表

单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。

实现:

class Node(object):
    """节点"""
    def __init__(self, elem):
        self.elem = elem
        self.next = None

class SingleLinkList(object):
    """单向链表"""
    def __init__(self, node=None):
        self.__head = node

    def is_empty(self):
        return self.__head == None

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

    def travel(self):
        """遍历整个链表"""
        if self.__head == None:
            return

        cur = self.__head

        while cur.next != self.__head:
            print(cur.elem, end=" ")
            cur = cur.next
        # 退出循环,cur指向尾节点,但尾节点的元素未打印
        print(cur.elem)

    def add(self, item):
        """链表头部添加元素"""
        node  = Node(item)
        if self.is_empty():  # 链表为空的时候
            self.__head = node  # 设置当前节点为头节点
            node.next = node  # 并将该节点的next指向自己
        else:
            cur = self.__head
            while cur.next != self.__head:
                cur = cur.next
            # 退出循环 cur 指向尾部节点
            node.next = self.__head
            self.__head = node
            cur.next = self.__head

    def append(self, item):
        """链表尾部添加元素"""
        node = Node(item)
        if self.is_empty():
            self.__head = node
            node.next = self.__head
        else:
            cur = self.__head
            while cur.next != self.__head:
                cur = cur.next
            node.next = self.__head
            cur.next = node

    def insert(self, pos, item):
        """
        指定位置添加元素
        :param pos: pos 从哪里开始
        :param item:
        :return:
        """
        if pos <= 0:
            self.add(item)
        elif pos > (self.length()-1):
            self.append(item)
        else:
            pre = self.__head
            count = 0
            while count < (pos-1):
                count += 1
                pre = pre.next

            # 当循环退出后,pre指向pos-1的位置
            node = Node(item)
            node.next = pre.next
            pre.next = node

    def remove(self, item):
        """删除节点"""
        if self.is_empty():
            return

        cur = self.__head
        pre = None
        while cur.next != self.__head:
            if cur.elem == item:
                # 判断是否为头节点
                if cur == self.__head:
                    # 找到尾部节点
                    rear = self.__head
                    while rear.next != self.__head:
                        rear = rear.next
                    self.__head = cur.next
                    rear.next = self.__head
                else:
                    pre.next = cur.next # 什么意思哟 斩断中间的,上一个指向当前斩断的下一个元素
                return
            else:
                pre = cur
                cur =cur.next
        # 退出循环, cur 指向尾节点
        if cur.elem == item :
            if cur == self.__head:
                # 说明就只有一个节点
                self.__head = None
            else:
                pre.next = self.__head

    def search(self, item):
        cur = self.__head
        while cur.next != self.__head:
            if cur.elem == item:
                return True
            else:
                cur = cur.next
        # 退出循环,cur指向尾节点
        if cur.elem == item:
            return True
        return False

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

    ll.append(1)
    print(ll.is_empty())
    print(ll.length())
    ll.append(2)
    ll.add(8)
    ll.append(3)
    ll.append(4)
    ll.append(5)
    ll.append(6)

    ll.travel()
    ll.insert(-1, 9)  # 9 8 1 23456
    ll.travel()
    ll.insert(3, 100)  # 9 8 1 100 2 3456
    ll.travel()
    ll.insert(10, 200)  # 9 8 1 100 23456 200
    ll.travel()
    ll.remove(100)
    ll.travel()
    ll.remove(9)
    ll.travel()
    ll.remove(200)
    ll.travel()
    print(ll.search(77))

 

【数据结构与算法】之单向循环链表的创建/遍历/插⼊/查找/删除算法实现 循环链表是一个收尾相接的链表,将单链表的最后一个指针域改由NULL改为指向表头结点这就是单链式的循环链表,并称为循环单链表。 带头结点的循环单链表的各种操作的算法实现与带头结点单链表的算法实现类似,差别仅在于算法判别当前结点p是否为尾结点的条件不同。单链表中的判别条件为p!=NULL或p->next!=NULL,而单循环链表判别条件是p!=L或p->next!=L。 在循环单链表中附设尾指针有时候比附设头指针更简单。 阅读详情

相关推荐

逆向拆解dy接口a_bogus 1.0.1.19版本核心算法(纯算版)第二部分

本文深入解析了dy接口a_bogus 1.0.1.19版本的核心算法,重点介绍了逆向分析的基础方法论、魔改Base64编码识别与还原、随机数生成与位运算解析等关键技术。通过详细的代码示例和实用技巧,帮助开发者掌握逆向工程中的关键步骤,特别是针对a_bogus参数的生成逻辑和混淆处理。

weixin_29288313的博客 411

数据结构与算法(单向循环链表)

单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。 #节点类 class Node(object): "节点" def __init__(self,elem): #构造函数 self.elem = elem self.next = None #对于一个节点的初始状态指向为空,因为不知道指向谁 ...

sun_xiao_kai的博客 411

VSCode关联VIVADO编辑Verilog

有时候接手别人的代码,或者从网上找的开源代码,每个人风格不一致,对齐缩进也不一样,阅读起来很累。有没有什么方法能快捷地格式化代码呢。下面我们利用VSCode插件来实现这个需求。Vivado是Xilinx公司提供的逻辑开发平台(之一),如果不喜欢Vivado自带的文本编辑器,可以选择第三方的文本编辑器VSCode。

小王在努力...的博客 7150

python——数据结构之单向循环链表

class Node(object): """节点""" def __init__(self, item): self.item = item self.next = None class SinCycLinkedlist(object): """单向循环链表""" def __init__(self): se...

Cherry的博客 320

基于稀疏表示字典学习的图像超分辨率-杨建超论文解析

文章:《Image Super-Resolution via Sparse Representation》 作者:杨建超 信号稀疏的定义: 令字典D的原子个数M,信号维度为N,则有以下三种关系: M = N时,D为完备的; M > N时,D为冗余的; M>>N时, D为过完备的。 图解如下: 借鉴了压缩感知的思想,通过对大量低分辨率图像和高分辨...

ycc18829026593的博客 7637

二十一、CANdelaStudio深入-SPRMIB的配置

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的肯定响应抑制位配置,欢迎各位朋友订阅、评论,可以提出宝贵意见,以持续输出更好的作品,同时会根据评论、私信不定期更新文章内容,以及专栏目录。订阅该专栏的朋友可私信小编免费答疑解惑(^U^)ノ~YO CANdelaStudio-从入门到深入目录 文章目录CANdelaStu

诊断协议那些事儿's blog 1870

数据结构(c语言版)-----单向循环链表的基本操作(初始化、插入、删除、修改、遍历等操作)

数据结构(c语言版)-----单向循环链表的基本操作(初始化、插入、删除、修改、遍历等操作) 单向循环链表的基本操作 单向循环链表和单链表的区别在于:单向循环链表的头节点和尾结点在同一位置,初始化时,要将其头节点和尾结点指向同一位置;并且在判断程序结束条件时,判断的是当前节点是否指向头节点或尾节点。 文章目录单向循环链表的基本操作创建单向循环链表头插法尾插法获取单向循环链表的长度在指定位置后插入元素根据下标删除元素根据元素的值删除元素根据下标寻找元素根据值获取元素的下标根据下标修改元素的值...

weixin_43870670的博客 9765

RAGFlow 系列教程 第14课:GraphRAG -- 知识图谱增强检索

RAGFlow v0.25.0深度解读了GraphRAG技术,通过构建知识图谱解决传统RAG在多跳推理问题上的局限。系统支持General GraphRAG和Light GraphRAG两种实现,包含四阶段构建流程:实体关系抽取、实体消解、社区检测和图持久化。核心代码位于rag/graphrag目录,采用LLM驱动的抽取机制,结合编辑距离和LLM确认的实体消解策略,以及Leiden社区检测算法。KGSearch模块通过多信号融合检索(实体+关系+N-hop+社区)实现高效查询。该系统将非结构化文本转化为可推

weixin_43674738的博客 101

python算法与数据结构005--单向循环链表的实现

class Node(object): """链表节点""" def __init__(self,data,next=None): self.data = data self.next = next class SingleCycleList(object): """单向循环链表""" def __init__(sel

youran02100210的专栏 298

SAR合成孔径雷达成像及处理(附带Matlab源代码)

总结:本文介绍了SAR合成孔径雷达的基本原理,并提供了使用Matlab实现SAR成像和处理的源代码示例。然后,在慢时间域进行方位压缩处理,通过计算每个接收通道的延迟和频移,将多次接收的信号叠加得到最终的成像结果。SAR成像的基本原理是通过接收雷达发射的脉冲信号的回波,并利用多次接收的信号进行叠加处理。以多普勒频移校正为例,根据雷达飞行速度和方位角,计算实际的多普勒频率,并对每个接收通道的数据进行频移校正,以消除因目标运动引起的频率偏移。通过调整参数和算法,可以实现不同的SAR成像和处理效果。

ByteJolt的博客 689

2026 MCM Problem A:智能手机电池连续时间建模——完整解题思路附第一问解题代码

摘要:本文针对2026年MCM A题"智能手机电池连续时间建模"问题,提出基于能量守恒原理的微分方程模型。通过建立以SOC(t)为状态变量的动态系统,将屏幕亮度、处理器负载等主要耗电因素纳入统一功率框架,实现了不同使用场景下的电量变化精确描述。研究表明,屏幕亮度和CPU负载对续航时间影响最大,温度与后台任务会产生放大效应。该模型具有物理可解释性和应用扩展性,为手机电源管理提供了理论依据。(150字)

一键难忘的博客 771

数据结构与算法——单向循环链表

简单来说,单向循环链表就是让单链表尾结点的指针域由null改为指向头结点,形成一个首尾相连的环形链表。就像衔尾蛇一样。 而单链表与单向循环链表的主要差异就在于循环的判断条件上,单链表判断的是p->next是否为空,而单向循环链表判断的是p->next是否等于头结点,如果等于,则循环结束。 注意:单链表我们用的是虚拟头结点,而单向循环链表head指向的则是真实的头结点。 1.单...

qq_43137918的博客 871

YOLO26全网首发:CVPR2026 FAA| 解决YOLO Neck跨尺度方向冲突--- FAAFusion频域对齐融合模块 | 暴力涨点篇

本文改进:FAAFusion引入YOLO neck ,代替nn.Upsample和Concat

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 644

数据结构与算法——python单向循环链表、双向链表

单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。 单向循环列表的实现 class Node(object): """节点""" def __init__(self, item): self.item = item self.next = None class SinCycLinkedlist(object): """单向循环链表""" def __init__(self):

C_teacher的博客 301

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Python数据结构与算法---单向循环链表

单向循环链表1. 循环链表2. 单向循环链表的实现 1. 循环链表 循环链表是一种特殊的单链表。实际上,循环链表也很简单。它跟单链表唯一的区别就在尾结点。我们知道,单链表的尾结点指针指向空地址,表示这就是最后的结点了。而循环链表的尾结点指针是指向链表的头结点。它像一个环一样首尾相连,所以叫作“循环”链表。 2. 单向循环链表的实现 # 节点的实现 class Node(object): d...

qq_45655207的博客 334

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数据结构与算法:Python实现单向链表与单向循环链表

题目单向链表单向循环链表 单向链表 # encoding=utf-8 """ Date:2019-07-06 16:11 User:LiYu Email:liyu_5498@163.com """ class Node(object): def __init__(self, element): self.element = element self.n...

Dreaming5498的博客 435

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

数据结构与算法 单向循环链表

/数到m的那个人出列,它的下一个人又从1开始报数,数到m的那个人又出列,依此规律重复下去,直到圆桌周围的人全部出列,输出人的出列顺序。//约瑟夫环是一个数学的应用问题 : 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围,从编号为k的人开始报数,cout << "删除的节点的数据为" << p->m_data << " ";//下面演示的是,最后一个节点,指向带头节点的地址,不是带头节点的下一位。cout << "约瑟夫环问题 " << endl;//删除p指向的节点。

2301_78867466的博客 331

数据结构与算法--单向循环链表

文章主要介绍单向循环链表以及实现,分步理解单向循环链表,为以后运用打下基础!

storyfull 333

数据结构与算法(链表:单向链表,单向循环链表,双向链表)

链表 为什么需要链表 顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁,所以使用起来并不是很灵活。 链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。 链表:(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。 单向链表 就是只有一...

Taiiiii的博客 401

python3循环链表检测、返回首节点_Python 实现·数据结构与算法之单向循环链表...

单向循环链表定义单向循环链表(Single Cycle Linked List)是单链表的一个变形,将链表中最后一个节点的next域不再为None,而是指向链表的头节点。节点示意图单向循环链表示意图单向循环链表的基本操作is_empty() 判断链表是否为空length 链表长度travel() 遍历整个链表,打印元素add(item) 在链表头部添加元素append(item) 在链表尾部添加元...

weixin_42129412的博客 198

Java数据结构与算法之单向循环链表

一、前言 上篇内容中主要介绍了普通的单链表,这篇内容主要介绍下一种特殊的单链表——单向循环列表。下面先从图例中对单向循环链表有一个整体的概念。 从图例中可以看出,单向循环链表和普通的单链表区别主要在于尾结点,单链表的尾结点指向一个空的地址,从而表示这是最后的结点,而单向循环链表是将尾结点的指针指向了头结点,首尾相连。 二、单向循环列表的特点分析: 1、空表的循环列表是头结点的后继指针指...

anyway8090的博客 837

数据结构与算法——>单向循环链表

继上一篇单项链表后(https://blog.youkuaiyun.com/papaxiong1/article/details/100906397) 我们发现,对于单链表,由于每个结点只存储了向后的指针,到了尾指针就停止了向后的操作,这样当中某一结点就无法找到它的前驱结点了,无法回头! 定义 将单链表中尾结点的指针从指向NUll指向头结点(或第一个元素结点),使得整个链表形成一个环,这种头尾相接的单链...

papaxiong1的博客 963

数据结构与算法-单向循环链表实现

单向循环链表 # coding:utf-8 class LinkedListNode(object): '''链表节点类''' def __init__(self, value): # 存储值的地方 self.value = value # 存储下一节点指针(位置) self.pointer = None ...

梦离的博客 220

【数据结构算法】②、单向循环链表的创建插入删除实现、单向循环链表的初始化、遍历、插入(首元结点、其他结点情况)、删除元素、查询元素

【数据结构算法】②、单向循环链表的创建插入删除实现、单向循环链表的初始化、遍历、插入(首元结点、其他结点情况)、删除元素、查询元素

慢慢来就很快。 2758

数据结构与算法-单向循环链表

定义 单向循环列表类似于单链表. 就是在单链表的尾部指向首结点

qinayou1213的博客 208
上一篇: 数据结构与算法-链表定义和单向链表的实现
下一篇: 数据结构与算法-链表之双向链表
LELELED
博客等级 码龄9年 3粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值