python实现单项链表

2024-03-10 09:28
文章标签 python 实现 链表 单项

本文主要是介绍python实现单项链表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 问题

如何用python实现单项链表。

2 方法

单向链表也叫单链表,是链表中最简单的一种形式,is_empty() 链表是否为空。length() 链表长度 travel() 遍历整个链表 add(item) 链表头部添加元素 append(item) 链表尾部添加元素 insert(pos, item) 指定位置添加元素 remove(item) 删除节点 search(item) 查找节点是否存在

Dan代码清单 1

#单链表的实现
class SingleLinkList(object):
   """单链表"""
def __init__(self):
       self._head = None
def is_empty(self):
       """判断链表是否为空"""
       return self._head == None
def length(self):
       """链表长度"""
       # cur初始时指向头节点
       cur = self._head
       count = 0
       # 尾节点指向None,当未到达尾部时
       while cur != None:
           count += 1
           # 将cur后移一个节点
           cur = cur.next
       return count
def travel(self):
       """遍历链表"""
       cur = self._head
       while cur != None:
           print(cur.item)
           cur = cur.next
def add(self, item):
       """头部添加元素"""
       # 先创建一个保存item值的节点
       node = SingleNode(item)
       # 将新节点的链接域next指向头节点,即_head指向的位置
       node.next = self._head
       # 将链表的头_head指向新节点
       self._head = node
def append(self, item):
       """尾部添加元素"""
       node = SingleNode(item)
       # 先判断链表是否为空,若是空链表,则将_head指向新节点
       if self.is_empty():
           self._head = node
       # 若不为空,则找到尾部,将尾节点的next指向新节点
       else:
           cur = self._head
           while cur.next != None:
               cur = cur.next
           cur.next = node
def insert(self, pos, item):
       """指定位置添加元素"""
       # 若指定位置pos为第一个元素之前,则执行头部插入
       if pos <= 0:
           self.add(item)
       # 若指定位置超过链表尾部,则执行尾部插入
       elif pos > (self.length() - 1):
           self.append(item)
       # 找到指定位置
       else:
           node = SingleNode(item)
           count = 0
           # pre用来指向指定位置pos的前一个位置pos-1,初始从头节点开始移动到指定位置
           pre = self._head
           while count < (pos - 1):
               count += 1
               pre = pre.next
           # 先将新节点node的next指向插入位置的节点
           node.next = pre.next
           # 将插入位置的前一个节点的next指向新节点
           pre.next = node
   def remove(self, item):
       """删除节点"""
       cur = self._head
       pre = None
       while cur != None:
           # 找到了指定元素
           if cur.item == item:
               # 如果第一个就是删除的节点
               if not pre:
                   # 将头指针指向头节点的后一个节点
                   self._head = cur.next
               else:
                   # 将删除位置前一个节点的next指向删除位置的后一个节点
                   pre.next = cur.next
               break
           else:
               # 继续按链表后移节点
               pre = cur
               cur = cur.next
   def search(self, item):
       """链表查找节点是否存在,并返回True或者False"""
       cur = self._head
       while cur != None:
           if cur.item == item:
               return True
           cur = cur.next
       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.append(3)
   ll.append(4)
ll.append(5)
   ll.append(6)
   ll.travel()
   print("链表中是否存在元素5:", ll.search(5))  

3 结语

链表由于增加了结点的指针域,空间开销比较大,但对存储空间的使用要相对灵活(不需要连续的存储空间)。

这篇关于python实现单项链表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/793794

相关文章

基于Python编写一个git自动上传的脚本(打包成exe)

《基于Python编写一个git自动上传的脚本(打包成exe)》这篇文章主要为大家详细介绍了如何基于Python编写一个git自动上传的脚本并打包成exe,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录前言效果如下源码实现利用pyinstaller打包成exe利用ResourceHacker修改e

Python在二进制文件中进行数据搜索的实战指南

《Python在二进制文件中进行数据搜索的实战指南》在二进制文件中搜索特定数据是编程中常见的任务,尤其在日志分析、程序调试和二进制数据处理中尤为重要,下面我们就来看看如何使用Python实现这一功能吧... 目录简介1. 二进制文件搜索概述2. python二进制模式文件读取(rb)2.1 二进制模式与文本

Python中Tkinter GUI编程详细教程

《Python中TkinterGUI编程详细教程》Tkinter作为Python编程语言中构建GUI的一个重要组件,其教程对于任何希望将Python应用到实际编程中的开发者来说都是宝贵的资源,这篇文... 目录前言1. Tkinter 简介2. 第一个 Tkinter 程序3. 窗口和基础组件3.1 创建窗

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

Java中Map的五种遍历方式实现与对比

《Java中Map的五种遍历方式实现与对比》其实Map遍历藏着多种玩法,有的优雅简洁,有的性能拉满,今天咱们盘一盘这些进阶偏基础的遍历方式,告别重复又臃肿的代码,感兴趣的小伙伴可以了解下... 目录一、先搞懂:Map遍历的核心目标二、几种遍历方式的对比1. 传统EntrySet遍历(最通用)2. Lambd

Django调用外部Python程序的完整项目实战

《Django调用外部Python程序的完整项目实战》Django是一个强大的PythonWeb框架,它的设计理念简洁优雅,:本文主要介绍Django调用外部Python程序的完整项目实战,文中通... 目录一、为什么 Django 需要调用外部 python 程序二、三种常见的调用方式方式 1:直接 im

Python字符串处理方法超全攻略

《Python字符串处理方法超全攻略》字符串可以看作多个字符的按照先后顺序组合,相当于就是序列结构,意味着可以对它进行遍历、切片,:本文主要介绍Python字符串处理方法的相关资料,文中通过代码介... 目录一、基础知识:字符串的“不可变”特性与创建方式二、常用操作:80%场景的“万能工具箱”三、格式化方法

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

SpringBoot全局异常拦截与自定义错误页面实现过程解读

《SpringBoot全局异常拦截与自定义错误页面实现过程解读》本文介绍了SpringBoot中全局异常拦截与自定义错误页面的实现方法,包括异常的分类、SpringBoot默认异常处理机制、全局异常拦... 目录一、引言二、Spring Boot异常处理基础2.1 异常的分类2.2 Spring Boot默

基于SpringBoot实现分布式锁的三种方法

《基于SpringBoot实现分布式锁的三种方法》这篇文章主要为大家详细介绍了基于SpringBoot实现分布式锁的三种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、基于Redis原生命令实现分布式锁1. 基础版Redis分布式锁2. 可重入锁实现二、使用Redisso