当前位置: 首页 > news >正文

链表(单链表、双链表)

前言:链表是算法中比较难理解的部分,本博客记录单链表、双链表学习,理解节点和指针的使用,主要内容包括:使用python创建链表、实现链表常见的操作。

目录

单链表

双链表


单链表

引入链表的背景:

先来看一下数据,数组是一块连续的区域,需要预留空间。

链表,是一种线性表,线性表包括顺序表、链表,但链表不像顺序表一样连续地存储数据,而是在每个节点里存放下一个节点的位置信息(地址)。

单链表,第一个节点是头节点,最后一个节点是尾节点。

操作链表时,需要注意特殊的情况:

  1. 空链表
  2. 只有一个头节点没有尾节点的链表,头节点地址指向空
  3. 有一个头节点,接着连接一个尾节点,没有中间节点

使用python语言创建一个单链表

需要实现以下功能:

  • 实现判断链表是否为空
  • 计算链表的长度
  • 在链表头部添加元素
  • 在链表尾部添加元素
  • 在链表的指定位置添加元素
  • 删除指定元素的节点
  • 判断节点是否存在
class Node(object):def __init__(self, elem):# 节点self.elem = elemself.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游标用来遍历节点cur = self.__headcount = 1while cur != None:count += 1cur = cur.nextreturn count# 链表的遍历def travel(self):cur = self.__headwhile cur != None:print(cur.elem, end=" ")cur = cur.next# 头部添加元素def add(self, item):node = Node(item)node.next = self.__headself.__head = node# 尾部添加元素def append(self, item):node = Node(item)if self.is_empty():self.__head = nodeelse:cur = self.__headwhile cur.next != None:cur = cur.nextcur.next = nodepass# 指定位置添加元素def insert(self, pos, item):if pos <= 0:self.add(item)elif pos > (self.length() - 1):self.append(item)else:pre = self.__headcount = 0while count < (pos - 1):count += 1pre = pre.next#     当循环退出后 pre指向pos-1node = Node(item)node.next = pre.nextpre.next = node# 删除元素 找到具体的数据删除def remove(self, item):cur = self.__headpre = Nonewhile cur != None:if cur.elem == item:if cur == self.__head:self.__head = cur.nextelse:pre.next = cur.nextbreakelse:pre = curcur = cur.next# 查找节点是否存在def search(self, item):cur = self.__headwhile cur != None:if cur.elem == item:return Trueelse:cur = cur.nextreturn False

双链表

双链表比单链表多了个前驱节点

使用python语言创建一个双链表

需要实现以下功能:

  • 实现判断链表是否为空
  • 计算链表的长度
  • 在链表头部添加元素
  • 在链表尾部添加元素
  • 在链表的指定位置添加元素
  • 删除指定元素的节点
  • 判断节点是否存在

 

class Node(object):def __init__(self, item):self.elem = itemself.next = Noneself.prev = Noneclass DoubleLinkList(object):# 双链表def __init__(self, node=None):self.__head = node# 判断链表是否为空def is_empty(self):return self.__head == None# 链表的长度def length(self):# cur游标用来遍历节点cur = self.__headcount = 1while cur != None:count += 1cur = cur.nextreturn count# 链表的遍历def travel(self):cur = self.__headwhile cur != None:print(cur.elem, end=" ")cur = cur.next# 头部添加元素def add(self, item):node = Node(item)node.next = self.__headself.__head = nodenode.next.prev = node# 尾部添加元素def append(self, item):node = Node(item)if self.is_empty():self.__head = nodeelse:cur = self.__headwhile cur.next != None:cur = cur.nextcur.next = nodenode.prev = curpass# 指定位置添加元素def insert(self, pos, item):if pos <= 0:self.add(item)elif pos > (self.length() - 1):self.append(item)else:cur = self.__headcount = 0while count < (pos - 1):count += 1cur = cur.next#     当循环退出后 pre指向posnode = Node(item)node.next = curnode.prev = cur.prevcur.prev.next = nodecur.prev = node# 删除元素 找到具体的数据删除def remove(self, item):cur = self.__headwhile cur != None:if cur.elem == item:if cur == self.__head:self.__head = cur.nextif cur.next:# 判断链表是否只有一个节点cur.next.prev = Noneelse:cur.prev.next = cur.nextif cur.next:cur.next.prev = cur.prevbreakelse:cur = cur.next# 查找节点是否存在def search(self, item):cur = self.__headwhile cur != None:if cur.elem == item:return Trueelse:cur = cur.nextreturn False

相关文章:

链表(单链表、双链表)

前言&#xff1a;链表是算法中比较难理解的部分&#xff0c;本博客记录单链表、双链表学习&#xff0c;理解节点和指针的使用&#xff0c;主要内容包括&#xff1a;使用python创建链表、实现链表常见的操作。 目录 单链表 双链表 单链表 引入链表的背景&#xff1a; 先来看…...

面试题08.05.递归算法

递归乘法。 写一个递归函数&#xff0c;不使用 * 运算符&#xff0c; 实现两个正整数的相乘。可以使用加号、减号、位移&#xff0c;但要吝啬一些。 示例1: 输入&#xff1a;A 1, B 10输出&#xff1a;10示例2: 输入&#xff1a;A 3, B 4输出&#xff1a;12提示: 保证乘法…...

分布式IT监控系统

公司的IT系统越来越复杂&#xff0c;对运维和维护服务的需求也越来越高。在这种环境下&#xff0c;分布式IT监控系统应运而生。它逐渐成为公司提高运营效率、保证业务高效运营的关键工具&#xff0c;功能强大&#xff0c;性能优良。 分布式IT监控系统是什么&#xff1f; 分布…...

Redis 是什么?

Redis是一种基于内存的数据库&#xff0c;数据的读写都是在内存中完成的&#xff0c;因此读写速度非常的快&#xff0c;常用于缓存&#xff0c;消息队列&#xff0c;分布式锁等场景。 Redis 在高并发项目中&#xff0c;担任着非常重要的作用&#xff0c;扛高并发的&#xff0c;…...

本地源制作

title: 本地源制作 createTime: 2020-10-29 18:05:52 updateTime: 2020-10-29 18:05:52 categories: linuxyum tags: 制作本地源 通过 createrepo 制作本地源 前提 : 前提制作本地源的机器可以安装 这个软件例如 下载nginx的时候 自己加上 nginx的yum的数据源 &#xff08;rp…...

树莓派(Linux系统通用)交叉编译(环境搭建、简单使用)

概念 交叉编译是指在一台计算机上编译运行在另一台计算机上的程序。&#xff08;编译是指&#xff0c;在一个平台上生成在该平台上的可执行程序&#xff09;通常情况下&#xff0c;编译器和目标平台的架构是不同的&#xff0c;例如&#xff0c;在一台x86平台上编译运行在ARM平…...

uniapp - 微信小程序实现腾讯地图位置标点展示,将指定地点进行标记选点并以一个图片图标展示出来(详细示例源码,一键复制开箱即用)

效果图 在uniapp微信小程序平台端开发,简单快速的实现在地图上进行位置标点功能,使用腾讯地图并进行标点创建和设置(可以自定义标记点的图片)。 你只需要复制代码,改个标记图标和位置即可。...

网络安全--IDS--入侵检测

1. 什么是IDS&#xff1f; IDS---入侵检测是防火墙的一个有力补充&#xff0c;形成防御闭环&#xff0c;可以及时、准确、全面的发现入侵弥补防火墙对应用层检查的缺失。对系统的运行状态进行监视&#xff0c;发现各种攻击企图、过程、结果&#xff0c;来保证系统资源的安全&a…...

js实现数组去重方式(12种方法)

目录 1、filter indexOf2、for object3、for includes4、for splice5、filter indexOf6、Map7、Set8、set Array.from9、sort 排序10、for findIndex11、双重for循环12、reduce 1、filter indexOf 数组去重&#xff1a;利用 filter 过滤 配合 indexOf 查找元素 var a…...

AI智能语音机器人的优势

1.高效自动拨号功能。 导入客户数据&#xff0c;外呼机器人自动拨号&#xff0c;无需看守&#xff0c;真人录音话术&#xff0c;定制场景问答和1秒内的问答响应&#xff0c;为客户带来真实准确的咨询体验。同时&#xff0c;每次通话结束后&#xff0c;外呼系统根据通话时间和关…...

BERT: 面向语言理解的深度双向Transformer预训练

参考视频&#xff1a; BERT 论文逐段精读【论文精读】_哔哩哔哩_bilibili 背景 BERT算是NLP里程碑式工作&#xff01;让语言模型预训练出圈&#xff01; 使用预训练模型做特征表示的时候一般有两类策略&#xff1a; 1. 基于特征 feature based &#xff08;Elmo&#xff09;…...

5-1.(OOP)初步分析MCV架构模式

组成&#xff1a;模型&#xff08;model&#xff09;、视图&#xff08;view&#xff09;、控制器&#xff08;controller&#xff09; view&#xff1a;界面、显示数据 model&#xff1a;数据管理、负责在数据库中存取数据以及数据合法性验证 controller&#xff1a;负责转…...

如何利用React和Flutter构建跨平台移动应用

如何利用React和Flutter构建跨平台移动应用 移动应用已经成为现代生活的一部分&#xff0c;每天都有大量的手机用户在使用各种各样的应用程序。对于开发者来说&#xff0c;构建一个适用于多个平台的移动应用是一个挑战。幸运的是&#xff0c;有一些工具可以帮助我们轻松地实现…...

npm install / webdriver-manager update报错 unable to get local issuer certificate

我这边遇到的问题&#xff0c;用的是angular&#xff0c;跑npm install的时候报错&#xff0c;一开始在.npmrc添加strict-sslfalse但是还是报错&#xff0c;搜索下记录。 参考解决&#xff1a; selenium - webdriver-manager update, Error: unable to get local issuer certi…...

电商项目高级篇-02 elasticsearch-下

电商项目高级篇-02 elasticsearch-下 4.2、QueryDSL返回指定字段 4.2、QueryDSL 返回指定字段 返回单个字段 GET bank/_search {"query": {"match_all": {}}, "sort": [{"balance": {"order": "desc"}}], &quo…...

计算机竞赛 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满…...

CloseableHttpClient详解

实现项目中的HttpUtil用到CloseableHttpClient&#xff0c;httpUtil源码&#xff1a;https://download.csdn.net/download/imwucx/88378340 于是学习CloseableHttpClient并记录一下。 一、CloseableHttpClient是什么&#xff1f; CloseableHttpClient实现了AutoCloseable接口和…...

从mysql 5.7 升级到 8.0 的一些注意事项

最近 mysql 5.7 版本将会终止安全更新&#xff0c;越来越多的朋友考虑升级 mysql 8.0&#xff0c;以下是一些刚开始使用时可能存在差异问题的地方&#xff0c;有一些其实在 mysql 5.7 版本里已经开始使用&#xff0c;这里整理一下方便查阅。 1、关于端口&#xff0c;该版本 My…...

喜迎中秋国庆双节,华为云Astro Canvas之我的中秋节设计大屏

目录 前言 前提条件 作品展示 薅羊毛 前言 大屏应用华为云Astro Canvas是华为云低代码平台Astro的子服务之一&#xff0c;是以数据可视化为核心&#xff0c;以屏幕轻松编排&#xff0c;多屏适配可视为基础&#xff0c;用户可通过图形化界面轻松搭建专业水准的数据可视化大屏…...

C++ stoi()函数的用法

stoi()函数的作用 将字符串转为相应进制&#xff0c;可以是8进制&#xff0c;10进制&#xff0c;16进制等&#xff0c;默认的情况下是10进制 stoi源码里面定义 stoi(const string& __str, size_t* __idx 0, int __base 10) 注意&#xff1a;idx 这个可能是版本的问题&…...

Learn Prompt- Midjourney案例:动漫设计

使用 Midjourney 生成动漫有两种方法&#xff1a;使用Niji模式或使用标准的 Midjourney 模型。Niji V5 是 Midjourney 的动漫专用模型。它建立在标准 Midjourney 模型的全新架构之上&#xff0c;更擅长生成命名的动漫角色。Niji V4于2023年12月发布&#xff0c;Niji V5于2023年…...

亚马逊无线鼠标FCC认证办理 FCC ID

无线鼠标是指无线缆直接连接到主机的鼠标&#xff0c;采用无线技术与计算机通信&#xff0c;从而省却电线的束缚。通常采用无线通信方式&#xff0c;包括蓝牙、Wi-Fi (IEEE 802.11)、Infrared (IrDA)、ZigBee (IEEE 802.15.4)等多个无线技术标准。随着人们对办公环境和操作便捷…...

MySQL常见数据类型、特点以及使用场景

以下是一些常见的MySQL数据类型及其特点&#xff0c;包括数据类型的占用字节数、最大存储值和适用场景&#xff1a; 1. 整数类型&#xff1a; TINYINT&#xff1a;1字节&#xff0c;范围从-128到127&#xff08;有符号&#xff09;&#xff0c;0到255&#xff08;无符号&…...

vue markdown显示为html

1、安装依赖markdown-it yarn add markdown-it 2、在页面中引用 import MarkdownIt from markdown-it3、实例化markdown-it const md new MarkdownIt()4、输出 <div class"answer" v-html"md.render(mdTxt)"></div>通过markdown-it可以将m…...

Spring整合RabbitMQ——生产者(利用配置类)

1.生产者配置步骤 2.引入依赖 3.编写配置 配置RabbitMQ的基本信息&#xff0c;用来创建连接工厂的 编写启动类 编写配置类 4. 编写测试类...

Linux基础工具|代码调试工具gdb的使用

1.debug/release gdb是一款Linux下的一款调试器&#xff0c;在没有图形化界面下&#xff0c;是一种不错的调试方案&#xff08;虽然在一般的开发环境中很少会使用gdb&#xff09; 不过要使用gdb&#xff0c;就先要了解debug和release版本。 发布软件的时候有一种叫debug版本…...

Ribbon负载均衡器

两种&#xff1a; 1.1 集中式负载均衡&#xff0c;服务端负载均衡 硬件 nginx 轮询、负载、哈希、随机、权重 为什么要做负载均衡&#xff1f; 1.2 客户端负载均衡器 用客户端 负载均衡器 很多机制可以自定义 小知识&#xff1a;不想让别人调自己&#xff0c;只想用别人的…...

初级软件测试入门教程

一、软件测试的基本概念 1、软件测试的定义 就是以发现错误为目的而运行程序的过程。 软件测试员的目标是找到软件缺陷&#xff0c;尽可能早一些&#xff0c;并确保其得以修复。 2、软件测试方法总体分类 试图验证软件是“工作的”&#xff08;所谓“工作的”就是指软件的…...

4项简化IT服务台任务的ChatGPT功能

近几个月&#xff0c;随着人工智能聊天机器人 ChatGPT 风靡全球&#xff0c;用户可以通过它生成脚本、文章、运动计划表等。同时&#xff0c;这项技术在各行各业都能够进行无穷无尽的应用&#xff0c;在本文中&#xff0c;我们将探讨这项现代技术如何帮助ITSM团队提升服务交付和…...

idea创建同级项目-纠结是SB

idea创建同级项目-纠结是SB 创建方法&#xff1a;...

武汉汉阳建设局官方网站/企业网站建设论文

开源项目&#xff1a;https://github.com/etsy/AndroidStaggeredGrid分享一下我用过之后&#xff0c;觉得最关键的地方。在给出的demo中有一个集合&#xff0c;记录每个位置的HeightRatio。设置Dyn/amicHeightTextView和DynamicHeightImageView的HeightRatio来控制显示的高度。…...

傻瓜式建设网站的软件/东莞网站排名提升

今天写了个触底加载的组件&#xff0c;因为经常用到&#xff0c;之前总会遇到一种需求&#xff0c;就是有一个列表&#xff0c;可以实现下拉刷新&#xff0c;上拉加载&#xff0c; 找了一个一个的插件&#xff0c;填了一个一个的坑后&#xff0c;决定自己写个触底加载&#xff…...

台湾新闻最新消息今天/seo线下培训机构

了解如何使用 Bootstrap 快速开发网站和 Web 应用程序&#xff08;包括移动友好型应用程序&#xff09;。Bootstrap 以 LESS 项目为基础&#xff0c;由 Twitter 的内部工程师开发&#xff0c;它为 Web 应用程序 UI 提供了一致的框架。 浏览器开发人员最后将其支持全都聚集在标准…...

设计一个电子商务网站建设方案/公司如何在百度宣传

cuisine[英][kwɪˈzi:n] [美][kwɪˈzin] n.烹饪&#xff0c;烹调法&#xff1b;菜肴 walnut[英][ˈwɔ:lnət] [美][ˈwɔlˌnʌt, -nət] n.胡桃&#xff08;树&#xff09;&#xff1b;胡桃木&#xff1b;胡桃木色 broccoli[英][ˈbrɔkəli:] [美][ˈbrɑkəli] n.花椰菜&…...

做前端网站用什么工具/北京网

1、访问ActionContext资源request&#xff0c;session,parameters (1)、action实现ServletRequestAware接口&#xff0c;并且重写setServletRequest() // request对象&#xff0c;不用设置get方法&#xff0c;只须重写set方法private HttpServletRequest request; Overridepubl…...

电脑制作网站总么做/模板建站和开发网站区别

&#xff08;一&#xff09;架构师技能树 大数据基础巩固&#xff08;录播&#xff09; HDFS分布式文件系统 1.HDFS架构设计 2.HDFS设计思想 3.数据块 4.机架感知 5.容错策略 6.数据本地性策略 7.读写流程分析 8.HDFS高可用原理 MapReduce分布式计算模型 1.基本原理 2.作业执…...