单向链表 : 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 事件中心】使用Kafka消费Azure EventHub中数据,遇见消费慢的情况可以如何来调节呢?

    问题描述 使用Kafka消费Azure EventHub中数据,遇见消费慢的情况可以如何来调节呢? 问题解答 查看Kafka Consumer的配置参数,其中最只要的一个参数为:max.poll.re ...

  2. 黑马python基础课的一些题

    1, 打印5行小星星 思路: 可以用1个星星乘以行数:还可以循环嵌套,外层循环控制行数,内层循环控制每一行应该输出多少个小星星,比如,第一行输出1个,第二行输出2个,内层循环可以当成列,只不过这个列要 ...

  3. C++ //常用集合算法 //set_intersection //求俩个容器的交集 //set_union //求两个容器的并集 //set_difference //求两个容器的差集

    1 //常用集合算法 2 //set_intersection //求俩个容器的交集 3 //set_union //求两个容器的并集 4 //set_difference //求两个容器的差集 5 ...

  4. 在Linux下开启指定端口号

    1.查看某个端口是否已开启,如果提示no表示未开启 #8888表示要查询的端口号firewall-cmd --query-port=8888/tcp 2.永久开启端口号,提示 success 表示成功 ...

  5. 新零售SaaS架构:什么是线上商城系统?

    零售商家为什么要建设线上商城 传统的实体门店服务范围有限,只能吸引周边500米内的消费者.因此,如何拓展服务范围,吸引更多消费者到店,成为了店家迫切需要解决的问题. 缺乏忠实顾客,客户基础不稳,往往是 ...

  6. 关于黑客网络 for linux,这个游戏的启动解决方法

    原帖位置https://tieba.baidu.com/p/6200215090

  7. 基于stm32H730的解决方案开发之freertos系统解析

    一 概述 在嵌入式小系统领域,freertos是一个非常厉害的角色.它和小芯片结合,能迸发出非常大的威力.这里在H730上使用了这个freertos,是应该做一个总结和备忘. 二 实例解析 1 线程初 ...

  8. python数组基本用法实例解析

    一 数组的内容的查找 array的查找是依靠index,超出内容的会报错误 import array int_array = array.array('i', [0, 1, 2, 3, 1, 2]) ...

  9. 基于Apollo3 Blue MCU芯片的可穿戴产品解决方案开发之六轴加速度传感器适配

    一 前记 MPU-60X0 是全球首例9 轴运动处理传感器.它集成了3 轴MEMS 陀螺仪,3 轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP(Digital Motion Processo ...

  10. ijkplayer编译-RTSP

    1.编译平台和版本 使用操作系统 Ubuntu 18.04 使用ndk版本:android-ndk-r14b-linux-x86_64.zip (使用r17c编译会报错) AS版本:4.2.2 1.1 ...