python实现·数据结构与算法之单向循环链表

数据结构——单向循环链表&双向循环链表 数据结构、单向循环链表、程序实现单向循环链表、方法操作示例、双向循环链表、程序实现双向循环链表 阅读详情

单向循环链表定义

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

节点示意图

单向循环链表节点示意图

单向循环链表示意图

单向循环链表示意图

单向循环链表的基本操作

  • is_empty() 判断链表是否为空
  • length 链表长度
  • travel() 遍历整个链表,打印元素
  • add(item) 在链表头部添加元素
  • append(item) 在链表尾部添加元素
  • insert(pos, item) 在指定位置插入元素
  • remove(item) 删除元素
  • clear() 清空链表
  • is_contain(item) 判断元素是否存在

Python代码实现

# 节点的代码实现

class Node(object):
    """节点"""
    def __init__(self, item):
        self.item = item
        self.next = None
# 单向循环链表代码实现

class SingleCycleLinkList(object):
    """单向循环链表"""
    def __init__(self):
        self._head = None

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

    @property
    def length(self):
        """返回链表的长度"""
        # 如果链表为空,返回长度0
        if self.is_empty():
            return 0
        count = 1
        cur = self._head
        while cur.next != self._head:
            count += 1
            cur = cur.next
        return count

    def travel(self):
        """遍历链表"""
        if self.is_empty():
            return
        cur = self._head
        print(cur.item)
        while cur.next != self._head:
            cur = cur.next
            print(cur.item)
        print("")


    def add(self, item):
        """头部添加节点"""
        node = Node(item)
        if self.is_empty():
            self._head = node
            node.next = self._head
        else:
            #添加的节点指向_head
            node.next = self._head
            # 移到链表尾部,将尾部节点的next指向node
            cur = self._head
            while cur.next != self._head:
                cur = cur.next
            cur.next = node
            #_head指向添加node的
            self._head = node

    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
            cur.next = node
            # 将node指向头节点_head
            node.next = self._head

    def insert(self, pos, item):
        """在指定位置添加节点"""
        if pos <= 0:
            self.add(item)
        elif pos > (self.length-1):
            self.append(item)
        else:
            node = Node(item)
            cur = self._head
            count = 0
            # 移动到指定位置的前一个位置
            while count < (pos-1):
                count += 1
                cur = cur.next
            node.next = cur.next
            cur.next = node

    def remove(self, item):
        """删除一个节点"""
        # 若链表为空,则直接返回
        if self.is_empty():
            return
        # 将cur指向头节点
        cur = self._head
        pre = None
        # 若头节点的元素就是要查找的元素item
        if cur.item == item:
            # 如果链表不止一个节点
            if cur.next != self._head:
                # 先找到尾节点,将尾节点的next指向第二个节点
                while cur.next != self._head:
                    cur = cur.next
                # cur指向了尾节点
                cur.next = self._head.next
                self._head = self._head.next
            else:
                # 链表只有一个节点
                self._head = None
        else:
            pre = self._head
            # 第一个节点不是要删除的
            while cur.next != self._head:
                # 找到了要删除的元素
                if cur.item == item:
                    # 删除
                    pre.next = cur.next
                    return
                else:
                    pre = cur
                    cur = cur.next
            # cur 指向尾节点
            if cur.item == item:
                # 尾部删除
                pre.next = cur.next
    
    def clear(self):
        """清空链表"""
        self._head = None

    def is_contain(self, item):
        """查找节点是否存在"""
        if self.is_empty():
            return False
        cur = self._head
        if cur.item == item:
            return True
        while cur.next != self._head:
            cur = cur.next
            if cur.item == item:
                return True
        return False
    
    def __len__(self):
        """可以使用len()方法获取链表长度"""
        return self.length
    
    def __iter__(self):
        """可使用循环遍历链表里的元素"""
        if self.is_empty():
            return
        cur = self._head
        yield cur.item
        while cur.next != self._head:
            cur = cur.next
            yield  cur.item
            
    def __contains__(self, item):
        """可以使用in进行判断是否在链表中"""
        if self.is_empty():
            return False
        cur = self._head
        if cur.item == item:
            return True
        while cur.next != self._head:
            cur = cur.next
            if cur.item == item:
                return True
        return False
# 测试数据

if __name__ == "__main__":
    print("--------创建链表-------")
    scl_list = SingleCycleLinkList()
    scl_list.add(1)
    scl_list.add(2)
    scl_list.append(3)
    scl_list.insert(2, 4)
    scl_list.insert(4, 5)
    scl_list.insert(0, 6)
    print("length:",len(scl_list))
    scl_list.travel()
    print(scl_list.is_contain(3))
    print(scl_list.is_contain(7))
    print(3 in scl_list)
    print(7 in scl_list)
    scl_list.remove(1)
    print("length:",len(scl_list))
    scl_list.travel()
    print("--------循环遍历-------")
    for i in scl_list:
        print(i)
# 输出结果

--------创建链表-------
length: 6
6
2
1
4
3
5

True
False
True
False
length: 5
6
2
4
3
5

--------循环遍历-------
6
2
4
3
5

算法分析

操作复杂度
访问元素 O ( n ) O(n) O(n)
在头部插入/删除 O ( n ) O(n) O(n)
在尾部插入/删除 O ( n ) O(n) O(n)
在中间插入/删除 O ( n ) O(n) O(n)

联系我们

个人博客网站:http://www.bling2.cn/

Github地址:https://github.com/lb971216008/Use-Python-to-Achieve

知乎专栏:https://zhuanlan.zhihu.com/Use-Python-to-Achieve

小专栏:https://xiaozhuanlan.com/Use-Python-to-Achieve

博客园:https://www.cnblogs.com/Use-Python-to-Achieve

关注微信公众号【不灵兔】,获取更多资料
Python全栈(二)数据结构和算法之4.单向循环链表的实现 循环链表是一种特殊的单链表,尾结点指针是指向链表的头结点。对is_empty() 判断链表是否为空、length() 返回链表的长度、travel() 遍历 、add(item) 在头部添加一个节点、append(item) 在尾部添加一个节点、insert(pos, item) 在指定位置pos添加节点、remove(item) 删除一个节点、search(item) 查找节点是否存在等方法进行了实现,详细具体、适合入门者。 阅读详情

相关推荐

数据结构与算法基础知识 (Python 语言)

是指把数据类型和数据类型上的运算封装在一起。最常用的数据运算:插入、删除、修改、查找、排序。

AI天才研究院 4954

【数据结构-C语言】单向链表,循环单向链表

顺序表:顺序存储的线性表 链式表:链式存储的线性表,简称链表 由于顺序表的缺点(数据连续存储),顺序存储的数据因为挤在一起而导致需要成片移动,那很容易想到的解决方案是将数据离散地存储在不同内存块中,然后再用指针将他们串起来,这种朴素的思路所形成的链式线性表,就是所谓的链表。顺序表和链表存在的基本样态如下图所示

sakura0908的博客 2999

关于动态存储器dram中rank,bank,device之间的关系

DEVICE_WIDTH表示设备的带宽(单位bit),每个列(column)包含DEVICE_WIDTH 位(bit),每一行(row)包含NUM_COLS个column。   而每一个bank包含NUM_ROWS个行(row)。所以一个设备(device)的存储容量为PER_DEVICE_STORAGE =NUM_ROWS*NUM_COLS*DEVICE_WIDTH*NUM_BANKS (i

wyj7260的专栏 4732

【数据结构】 循环单链表的基本操作 (C语言版)

【数据结构】 循环单链表的基本操作 (C语言版)

weixin_56814370的博客 2394

贴片二极管SOD封装详解:SOD-123/323/523尺寸焊盘设计要点

表面贴装技术中,二极管封装尺寸直接决定PCB布局与焊接可靠性。SOD封装作为小外形二极管的主流形态,其SOD-123、SOD-323、SOD-523三种规格分别对应不同的功耗与占板面积权衡。理解封装尺寸、焊盘设计计算逻辑和钢网开窗原理,是避免立碑、虚焊等工艺缺陷的关键。在可穿戴设备、电源保护等空间受限场景中,合理选择封装不仅能优化散热路径,还能提升量产良率。本文从焊盘计算、工艺要点到选型策略,全面解析SOD封装的工程实践。

weixin_42520780的博客 305

BCM-BCP-DRP-运维管理之故障管理——故障的分类与处理流程

ITSM Business Continuity Manage(BCM) BusinessContinuityPlan(BCP) 偏业务 DisasterRecoveryPlan(DRP) 偏IT 天塌了,考虑在天塌了的状态下做什么,怎么开展业务就是BCP; 天塌了,考虑怎么把天撑回去,就是DRP。 DRP+BCP+供应链管理+危机管理等就是BCM (业务连续性管...

mmgithub123的博客 2722

单向链表、单向循环链表的基本操作

单向链表的基本操作

weixin_52545652的博客 589

昇腾AI处理器Ascend C编程:从C/C++基础到高性能算子开发实战

异构计算是提升AI算力效率的核心技术,通过在CPU之外引入专用处理器(如GPU、NPU)协同工作,实现大规模并行计算。其原理在于将计算密集型任务卸载到专用硬件,利用其高并行架构加速处理。技术价值在于突破传统CPU的算力瓶颈,为深度学习训练与推理提供强大动力,广泛应用于模型部署、科学计算和高性能计算场景。本文聚焦昇腾AI处理器的原生编程语言Ascend C,它基于C/C++标准扩展,通过显式内存管理和任务并行模型,充分发挥达芬奇架构中Cube与Vector单元的性能。针对CANN算子开发,文章详解了从环境搭建

weixin_34411563的博客 366

单向循环链表的基本操作(头插,尾插,从任意结点处遍历整个链表)

单向循环链表与单链表的区别: 单向循环链表: 1.尾结点的指针域指向首结点,可以通过任意结点遍历整个链表 tail->next = head; 2.为空链表时,头结点指向自己 head->next = head; 单链表: 1.尾结点的指针域指向NULL,只可以通过头结点遍历整个链表 tail = NULL; 2.为空链表时,...

小菜鸟的进阶 3630

一文读懂AI大模型时代的RAG技术

RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合检索技术与生成模型的技术架构,旨在通过动态引入外部知识库增强大语言模型(LLM)的生成能力。其核心思想是通过检索系统从外部数据源(如企业知识库、实时文档等)获取相关信息,并将检索结果作为上下文输入生成模型,以提高生成答案的准确性、时效性和专业性

awei0916的专栏 2119

工业缺陷标注要人命?我从零搭了一套自动标注系统,标注效率直接提升10倍

你是不是也深陷工业缺陷标注的无尽内耗?这不是个例,工业视觉项目落地,80%的时间和成本,都耗在了数据标注环节。普通的图像标注(猫狗分类、人脸识别),标注门槛低、规则简单、一致性要求宽松;而工业缺陷标注,是CV领域公认的地狱级难度:缺陷尺寸小到几像素、种类繁杂且非标、行业专业性极强、标注精度要求到像素级、正负样本极度不均衡,人工标注不仅效率低、成本高,更直接决定了模型的最终上限。我在工业视觉行业摸爬滚打了6年,踩遍了人工标注的所有坑,最终从零搭建了一套工业缺陷专用的闭环自动标注系统,把原来一张图30分钟的标注

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 202

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

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

youran02100210的专栏 297

使用epiDisplay包中的logistic

其中的logistic.display函数可以用于获取逻辑回归模型的汇总统计信息,包括自变量的优势比和置信区间,以及回归系数的Wald检验的p值。最后,我们使用print函数打印出汇总统计信息。使用epiDisplay包中的logistic.display函数获取逻辑回归模型的汇总统计信息(包括自变量的初始和调整后的优势比及置信区间,回归系数的Wald检验的p值)- R语言。通过使用logistic.display函数,我们可以方便地获取逻辑回归模型的重要统计信息,并对自变量的影响进行解释和推断。

CyberJolt的博客 608

python3循环链表检测、返回首节点_【数据结构与算法Python描述】——单向循环链表简介、Python语言实现及应用...

【数据结构与算法Python描述】——单向线性链表简介及其Python实现给出了链表的最简单形式——单向线性链表,以及其Python语言实现和相关应用。实际上,基于单向线性链表的变形很多,而单向循环链表(本文简称“循环链表”)是其中一种较为常见的形式。一、单向循环链表引入在文章【数据结构与算法Python描述】——队列和双端队列简介及其高效率版本Python实现中,我们首次引入了循环的概念,但实际...

weixin_34220317的博客 265

SAP_MM_配额安排_PA认证总结

配额安排是企业进行供应商管理的一种方式。通过配额管理,企业可以与多家供应商保持业务往来,以保证某些紧缺原材料的正常供货。此外,企业也可以通过不同的配额比例,提高供应商优化服务、降低价格的积极性。

java_zhong1990的专栏 1021

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

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

weixin_42129412的博客 198

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数据结构与算法: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

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

https://www.bilibili.com/video/av53583801?p=25 学习笔记

bluebloodye的专栏 240

python数据结构-双向链表-单向循环链表-栈-队列

python数据结构-双向链表-单向循环链表-栈-队列的操作和实现

sshi9的博客 1244

数据结构与算法(Python)第四天

数据结构与算法(Python)第四天

weixin_47049321的博客 125

python数据结构之链表_Python实现的数据结构与算法之链表详解

本文实例讲述了Python实现的数据结构与算法之链表。分享给大家供大家参考。具体分析如下:一、概述链表(linked list)是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的链接。根据结构的不同,链表可以分为单向链表、单向循环链表、双向链表、双向循环链表等。其中,单向链表和单向循环链表的结构如下图所示:二、ADT这里只考虑单向循环链表ADT,其他类型的链表A...

weixin_39923572的博客 122

python数据结构4 双向链表+单向循环链表

双向链表+单向循环链表双向链表操作节点实现头插法、尾插法指定位置插入节点单向循环链表操作节点实现链表长度遍历列表头插法、尾插法在指定位置添加元素删除元素查找元素 双向链表 一种更复杂的链表是“双向链表”或“双面链表”。每个节点有两个链接:一个指向前一个节点(前驱节点),当此节点为第一个节点时,指向空值;而另一个指向下一个节点(后继节点),当此节点为最后一个节点时,指向空值。 操作 is_empty() 链表是否为空 length() 链表长度 travel() 遍历链表 add(item) 链表头部添加

qq_42749341的博客 318

Python之数据结构与算法学习笔记

   Python内置类型性能分析 队列 class Queue(object): def __init__(self): self.__list = [] def enqueue(self, item): self.__list.append(item) def dequeue(self): re...

zhouyuming_hbxt的博客 577

数据结构之链表

链表(Linked list): 是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。 单链表: 每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。 ...

m0_52785249的博客 158

Python实现单向循环链表的封装

单向循环链表 单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。 单向循环链表的操作和代码实现 单向循环链表的操作和单向链表的一样,只不过末尾节点的next指向了head,进行有些操作时的判断条件发生了改变。 还是和之前一样,我们先进行节点的声明和链表长度,是否为空的代码实现: class Node(object): """节点封装""" def __init__(self, element): self.element

Wangtuo1115的博客 390

python实现单向循环链表

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

weixin_34233679的博客 73
上一篇: python实现·数据结构与算法之单向链表
下一篇: python实现·数据结构与算法之双向链表
南风以南
博客等级 码龄10年 440粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南风以南

如给您带来些许明朗,赏一杯香茗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值