单向链表 : 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版本)的更多相关文章

  1. Java实现单链表的增删查改及逆置打印

    //所提供的接口 LinkList.java package Struct; public interface LinkList {//判断链表为空public boolean linkListIsE ...

  2. SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)

    SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)-DML 1.SQL INSERT INTO 语句(在表中插入) INSERT INTO 语句用于向表中插入新记录. SQL I ...

  3. SQL Server 表的管理_关于表的操作增删查改的操作的详解(案例代码)

    SQL Server 表的管理_关于表的操作增删查改的操作的详解(案例代码) 概述: 表由行和列组成,每个表都必须有个表名. SQL CREATE TABLE 语法 CREATE TABLE tabl ...

  4. [置顶] cocos2dx sqllite 增删查改等操作

    首先导入文件shell.c sqllite3.c sqlite3.h sqlite3etx.h文件(注意在生成安卓项目是 不要将shell.c写进android.mk文件中,写进去在cywin中生成会 ...

  5. [原创]用C++类实现单向链表的增删查和反转操作

    数据结构这东西,理解起来不算难,但是实现难度就不小了,虽然思路很清晰,但不知道从何下手还有语言的细节问题一直是阻碍初学者的主要障碍(比如我).今天用了一下午时间终于独立完成了链表操作. 找网上的代码, ...

  6. C语言 链表的使用(链表的增删查改,链表逆转,链表排序)

    //链表的使用 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include< ...

  7. c++链表-双向链表+增删查改

    基于双向链表的增删改查和排序(C++实现) 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前 ...

  8. Elasticsearch(ES)API 增删查改常用操作

    常用操作 查询所有数据 POST http://192.168.97.173:27009/logstash_test_2018/doc/_search { "query": { & ...

  9. php学习笔记:对文件的增删查改等操作

    文件的创建: 采用touch()函数,当文件不存在会被创建 例如: <?php header("Content-type: text/html; charset=utf-8" ...

  10. 4.在MVC中使用仓储模式进行增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-using-the-repository-pattern-in-mvc/ 系列目录: ...

随机推荐

  1. 【Azure 应用服务】App Service for Linux 环境中为Tomcat页面修改默认的Azure 404页面

    问题描述 在App Service Linux环境中,如部署Tomcat 应用后,如果访问的页面找不到,应用会返回一个由Azure生成的404页面,那么是否可以修改它呢? PS: 如果是App Ser ...

  2. 方便快速的看到C/C++代码汇编 objdump 英特尔语法

    目录 概述 Objdump 所有参数 其他的 概述 因为奇怪的考试要求,最近经常有奇怪的问题,例如为什么(++a)+(++a)=14 发现反编译出汇编之后,就能解释很多奇怪的问题 Objdump 一次 ...

  3. 17. Class字节码指令解析

    ## 1. 概述 官方文档:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html Java 字节码对于虚拟机,就好像汇编语言对于 ...

  4. Java对象引用和内存管理的细节

    在Java中,当局部变量(比如方法参数)的作用域结束时,这个局部变量的引用确实不再存在,但这并不意味着它引用的对象会被销毁.对象的销毁是由Java的垃圾回收器(Garbage Collector, G ...

  5. 用几张图实战讲解MySQL主从复制

    本文分享自华为云社区<结合实战,我为MySQL主从复制总结了几张图!>,作者: 冰 河. MySQL官方文档 MySQL 主从复制官方文档链接地址如下所示: http://dev.mysq ...

  6. centos 定时任务

    想法 看见一个别的项目,每天扒bing的背景,然后 生成个列表,然后数据就一天天的增加,创意非常好 有时间研究下 关键字 centos 定时任务 基于centos7系统定时任务创建 https://b ...

  7. Ayu vscode主题

    Ayu vscode主题

  8. PE文件手工压缩

    序 本文要压缩的PE文件来自软件漏洞这门课上布置的作业,代码逻辑很简单,直接运行就能看出来,就是调库来弹两个对话窗口.笔者主要记录一下对这个文件的分析和一步步实现手工压缩的过程.在此提供原文件的下载方 ...

  9. JAVA | Guava EventBus 使用 发布/订阅模式

    系列文章目录 Go | Go 语言打包静态文件以及如何与Gin一起使用Go-bindata Go | Gin 解决跨域问题跨域配置 目录 系列文章目录 前言 一.为什么要用 Observer模式以及 ...

  10. 一个简易的ORM框架的实现(一)

    一个简易的ORM框架的实现 ORM ORM---操作数据库---对象关系映射 ORM(Object Relational Mapping)框架采用元数据来描述对象与关系映射的细节.只要提供了持久化类与 ...