单链表实现增删查改等操作(python版本)
单向链表 : SingleLinkedList
节点类属性:
数据域:value 节点存储的数据
地址域:next 指向下一个节点的地址
链表类属性:
头指针:head 指向链表的第一个节点的地址
尾指针:tail 指向链表的最后一个节点的地址
方法
is_empty(self) 链表是否为空
length(self) 链表长度
travel(self. ) 遍历整个链表
add(self, item) 链表头部添加元素
append(self, item) 链表尾部添加元素
insert(self, pos, item) 指定位置添加元素
remove(self, item) 删除节点
search(self, item) 查找节点是否存在
功能实现
定义节点类
class Node(object):
# 初始化节点
def init(self, value):
self.value = value # 数据域
self.next = None # 地址域
定义链表类
class SinglelinkedList(object):
# 初始化链表
def init(self, node=None):
self.head = node # 头指针
self.tail = node # 尾指针
# 判断链表是否为空
def is_empty(self):
return self.head == None
# 链表长度
def length(self):
# 记录当前节点
cur = self.head
# 记录长度
count = 0
# 判断节点是否为空
while cur is not None:
# 单次循环,节点计数+1
count += 1
# 移动到下一个节点
cur = cur.next
# 返回长度
return count
# 遍历整个链表
def travel(self):
# 记录当前节点
cur = self.head
# 判断节点是否为空
while cur is not None:
# 输出节点数据
print(cur.value)
# 移动到下一个节点
cur = cur.next
# 链表头部添加元素
def add (self, value):
# 创建新节点
new_node = Node(value)
# 将新节点的地址域指向头指针
new_node.next = self.head
# 将头指针指向新节点
self.head = new_node
# 链表尾部添加元素
def append(self, value):
# 创建新节点
new_node = Node(value)
# 判断链表是否为空
if self.length() == 0:
# 链表为空,则新节点直接为头
self.head = new_node
# 链表不为空,则尾指针指向新节点
else:
# 记录当前节点
cur = self.head
# 遍历链表,找到尾指针
while cur.next is not None:
# 移动到下一个节点
cur = cur.next
# 新节点地址指向尾节点
cur.next=new_node
# 指定位置添加元素
def insert(self, pos, value):
# 判断输入的位置是否小于等于0,若小于等于0,则直接添加到头部
if pos <= 0:
self.add(value)
# 若输入的位置大于等于链表长度,则直接添加到尾部
elif pos >= self.length():
self.append(value)
else:
# 把要插入的元素转换成节点
new_node = Node(value)
# 定义变量cur,表示要插入位置的那个节点
cur = self.head
# 定义变量count,表示当前遍历的节点数
count = 0
# 遍历链表,找到要插入的位置
while count < pos-1:
# 移动到下一个节点
cur = cur.next
# 节点数+1
count += 1
# 新节点地址域指向要插入位置的节点的地址域
new_node.next = cur.next
# 要插入的位置节点地址域指向新节点
cur.next = new_node
# 删除节点
def remove(self, value):
# 记录当前节点
cur = self.head
# 定义计数器
count = 0
# 判断当前节点是否为空,若不为空则循环
while cur is not None:
# 若当前节点数据域等于要删除的节点数据域,则删除当前节点
if cur.value == value:
# 若当前节点是头节点,则头指针指向下一个节点
if count == 0 :
self.head = cur.next
else:
# 若当前节点不是头节点,则将前一个节点的地址域指向当前节点的下一个节点
pre.next = cur.next
# 若删除的是尾节点,则尾指针指向前None
if cur.next is None:
self.tail = None
return True # 删除成功
# 移动到下一个节点
pre = cur
cur = cur.next
# 节点计数+1
count += 1
# 若循环结束,则没有找到要删除的节点,返回False
return False
# 查找节点是否存在
def search(self, value):
# 记录当前节点
cur = self.head
# 定义count变量,记录当前遍历的节点数
count = 0
# 判断当前是否是否为空,如果不是,就循环
while cur is not None:
# 若当前节点数据域等于要查找的节点数据域,则返回True
if cur.value == value:
return True
# 节点数+1
count += 1
# 移动到下一个节点
cur = cur.next
# 若循环结束,则没有找到要查找的节点,返回False
return False
测试代码
if name == 'main':
# 创建链表
link = Node('李白')
# 输出节点信息
print(link)
# 输出节点数据域信息
print(link.value)
# 输出节点地址域信息
print(link.next)
# 测试单向链表类
sll=SinglelinkedList(link)
# 输出链表头指针信息
print(sll.head)
# 输出链表头节点数据域信息
print(sll.head.value)
print('-'*31)
# 测试链表是否为空
print(sll.is_empty())
# 输出链表长度
print(sll.length())
# 遍历整个链表
sll.travel()
print('-'*31)
# 链表头部添加元素
sll.add('杜甫')
sll.add('白居易')
sll.travel()
print('-'*31)
# 链表尾部添加元素
sll.append('辛弃疾')
sll.append('王维')
sll.travel()
print('-'*31)
# 指定位置添加元素
sll.insert(2,'王羲之')
sll.travel()
print('-'*31)
# 删除指定位置元素
sll.remove('白居易')
sll.travel()
print('-'*31)
# 查找元素是否存在
print(sll.search('辛弃疾'))
单链表实现增删查改等操作(python版本)的更多相关文章
- Java实现单链表的增删查改及逆置打印
//所提供的接口 LinkList.java package Struct; public interface LinkList {//判断链表为空public boolean linkListIsE ...
- SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)
SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)-DML 1.SQL INSERT INTO 语句(在表中插入) INSERT INTO 语句用于向表中插入新记录. SQL I ...
- SQL Server 表的管理_关于表的操作增删查改的操作的详解(案例代码)
SQL Server 表的管理_关于表的操作增删查改的操作的详解(案例代码) 概述: 表由行和列组成,每个表都必须有个表名. SQL CREATE TABLE 语法 CREATE TABLE tabl ...
- [置顶] cocos2dx sqllite 增删查改等操作
首先导入文件shell.c sqllite3.c sqlite3.h sqlite3etx.h文件(注意在生成安卓项目是 不要将shell.c写进android.mk文件中,写进去在cywin中生成会 ...
- [原创]用C++类实现单向链表的增删查和反转操作
数据结构这东西,理解起来不算难,但是实现难度就不小了,虽然思路很清晰,但不知道从何下手还有语言的细节问题一直是阻碍初学者的主要障碍(比如我).今天用了一下午时间终于独立完成了链表操作. 找网上的代码, ...
- C语言 链表的使用(链表的增删查改,链表逆转,链表排序)
//链表的使用 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include< ...
- c++链表-双向链表+增删查改
基于双向链表的增删改查和排序(C++实现) 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前 ...
- Elasticsearch(ES)API 增删查改常用操作
常用操作 查询所有数据 POST http://192.168.97.173:27009/logstash_test_2018/doc/_search { "query": { & ...
- php学习笔记:对文件的增删查改等操作
文件的创建: 采用touch()函数,当文件不存在会被创建 例如: <?php header("Content-type: text/html; charset=utf-8" ...
- 4.在MVC中使用仓储模式进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-using-the-repository-pattern-in-mvc/ 系列目录: ...
随机推荐
- 【Azure Redis 缓存】应用中出现连接Redis服务错误(production.ERROR: Connection refused)的排查步骤
问题描述 在PHP应用中,连接Redis的方法报错 RedisException(code: 0): Connection refused at /data/Redis/Connectors/Php ...
- 深入解析ASP.NET Core MVC应用的模块化设计[上篇]
ASP.NET Core MVC的"模块化"设计使我们可以构成应用的基本单元Controller定义在任意的模块(程序集)中,并在运行时动态加载和卸载.这种为"飞行中的飞 ...
- C++ //案列-评委打分 //(容器添加 删除 算法排序 随机数 字符串追加)描述:5名选手 ABCDE,10个评委分别对每一位选手打分,去除最高分,去除评委中的 //的最低分,取平均分
1 #include<iostream> 2 #include<string> 3 #include<deque> 4 #include<vector> ...
- 解决centos启动zookeeper集群,但是状态显示报错:Error contacting service. It is probably not running 与连接超时,连接被拒绝问题
安装zookeeper-3.4.10的时候,启动正常没报错,但bin/zkServer.sh status查看状态的时候却出现错误,如下: 这些都是我之前出现的问题,刚开始我出现的问题是连接超时,后来 ...
- 线段树-多个懒标记pushdown
P3373 [模板]线段树 2 这里需要用到两个懒标记,一个懒标记为add,记录加,另一个懒标记为mul,记录乘. 我们需要规定一个优先级,然后考虑如何将懒标记下传. 这里无非有两种顺序,一种是先乘后 ...
- 上来就对标 20k Star 的开源项目,是自不量力还是后起之秀?
先来一段紧箍咒:nvm.fvm.gvm.sdkman.fnm.n.g.rvm.jenv.phpbrew.rustup.swiftenv.pyenv.rbenv... 这些都是用来解决编程语言多版本管理 ...
- 网关接口映射项目 前端 nestjs 项目名称 tf-gateway-http-proxy 改Nginx了
需求 前端 需要连接后台地址,每次换别人联调都要修改,好几个项目的时候,就要改好几个 关键每次git提交 还会显示文件修改了 强迫症患者 表示 忍不了 群里有人给了个脚本 有时间可以替换nginx h ...
- navigator.aardio 代码备份
import win.ui; import console; import process; import string.regex; import libs.router; /*DSG{{*/ ma ...
- php time 时间 前台拿到 需要*1000能正确显示 dayjs(time*1000).format('YYYY-MM-DD HH:mm:ss')
php time 时间 前台拿到 需要1000能正确显示 dayjs(time1000).format('YYYY-MM-DD HH:mm:ss')
- 用python进行二进制bin文件合并
一 基本概念 bin文件合并是嵌入式中常用的,这里给一个实例. 二 实例分析 import os import argparse import hashlib offset1 = 0x0010000 ...