单向链表 : 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. nginx 基本功能

    1.nginx简介 官方文档 Nginx是一个高性能WEB服务器,除它之外Apache.Tomcat.Jetty.IIS,它们都是Web服务器,或者叫做WWW(World Wide Web)服务器,相 ...

  2. Java 数组 数据类型默认值

    1 public static void main(String[] args) 2 { 3 int[] arry = new int[4]; //int 默认值0 //浮点型 0.0 4 for(i ...

  3. Codeforces Round 829 (Div. 1)A1. Make Nonzero Sum (easy version)(思维找规律)

    先考虑无解的情况:当n为奇数时无解 相邻的两个元素一定可以变成0 \[a[i] != a[i + 1]时, 分成[i, i], 和[i + 1, i + 1] \] \[a[i] = a[i + 1] ...

  4. mybatis使用postgresql中的jsonb数据类型

    最近新开发的一个功能使用到postgresql中的jsonb数据类型.架构师可能考虑到这种数据格式更加便于存储json格式的数据,因此考虑使用这种数据类型.自己以前未曾使用过这种数据类型,因此需要现学 ...

  5. react 中 动态添加 class,防止图片 重复加载, 主要是 background-image的二次加载会有新请求,和图片的闪烁

    react 中 动态添加 class,防止图片 重复加载, 主要是 background-image的二次加载会有新请求,和图片的闪烁 let imageTopBg if (imgSrcBg) { c ...

  6. GO 语言的并发编程相关知识点简介与测试【GO 基础】

    〇.什么是协程 Coroutines ? 进程和线程太常见,本文就不再赘述了,直接一起看下什么是协程.如下图,先看下协程的定位: 关于用户空间和内核空间:进程运行起来就涉及到对内存资源的管理,然而内存 ...

  7. C++学习笔记之进阶编程

    目录 进阶编程 STL(Standard Template Library) 容器(container) 仿函数(functor) 算法(algorithm) transform 查找 全排列 迭代器 ...

  8. KETTLE实战视频教程--免费白嫖(本贴持续更新)

    KETTLE实战视频教程 欢迎关注笔者的公众号: java大师, 每日推送java.kettle运维等领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!!个人网站: http://w ...

  9. Mysql中数据类型括号中的数字代表的含义

    相信大家不管是看别人的代码,还是自己的代码总会在定义表的数据类型时,会需要在数据类型后面加一个括号,里面写一个参数,例如int(3),smallint(5),char(5)等,但是括号里面的数字到底是 ...

  10. 三维模型3DTile格式轻量化在数据存储的重要性分析

    三维模型3DTile格式轻量化在数据存储的重要性分析 三维模型3DTile格式轻量化在数据存储中占有重要地位.随着科技的不断发展,尤其是空间信息科技的进步,人们对于三维地理空间数据的需求日益增长.然而 ...