单向链表 : 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. 关于centos安装32位兼容库找不到依赖包的问题

    可以看这个博主写的  https://blog.csdn.net/ai74le/article/details/87195077

  2. 『Echarts』基本使用

    一.前言 本篇文章是『Echarts』文章的第 2 篇,主要介绍『Echarts』基本使用 在『Echarts』第 1 篇文章中,我们介绍了 Echarts 的概述及其强大的数据可视化功能.本篇将继续 ...

  3. 可视化学习:使用WebGL实现网格背景

    前言 作为前端开发人员,我们最关注的就是应用的交互体验,而元素背景是最基础的交互体验之一.一般而言,能够使用代码实现的界面,我们都会尽可能减少图片的使用,这主要是有几方面的原因,第一,是图片会消耗更多 ...

  4. Java 多态性的使用

    1 package com.bytezreo.duotai3; 2 3 /*** 4 * 5 * @Description 练习多态性的使用 6 * @author Bytezero·zhenglei ...

  5. 修改主频 & 时钟树

    在system_stm32f10x.c中可以更改这个 最先调用void SystemInit (void)启动HSI+各种恢复缺省配置    然后   调用 SetSysClock();执行设置时钟7 ...

  6. day01-数据库的安装和使用

    Java数据库的安装和使用 1.数据库的作用 一个问题:淘宝网.京东.微信抖音,都有各自的功能,那么我们退出系统的时候,为什么信息还在? 解决之道-文件,数据库 为了解决上诉问题,使用更加利于管理数据 ...

  7. java list转set用法

    参考:https://blog.csdn.net/kye055947/article/details/80561633 之前一直被这两list转set,set转list所烦恼,今天整理了下两者之间怎么 ...

  8. 【atcoder 293 E - Sugoroku 4】【动态规划,递推】

    import java.io.IOException; import java.util.Arrays; import java.util.Scanner; public class Main { s ...

  9. 网站https 问题记录

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 开发过程中 常见的 https 问题 - 避坑 做前端多年,发现有些问题需要重复解决很多次,浪费了不少时间,https 导致的问题就属于其 ...

  10. 记录--微信小程序获取用户信息(附代码、流程图)

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 本篇文章主要总结了微信小程序开发,获取用户信息的整个流程步骤.补充了网上很多碎片化的代码,本人梳理了思路写下了这篇文章. 思路 1.在js ...