python实现一个无序单链表
class Node:
"""先定一个node的类""" def __init__(self, value=None, next=None):
self.value = value
self.next = next def getValue(self):
return self.value def getNext(self):
return self.next def setValue(self, new_value):
self.value = new_value def setNext(self, new_next):
self.next = new_next class LinkedList:
"""实现一个单向链表及其各类操作方法""" def __init__(self):
"""初始化空链表"""
self._head = Node()
self._tail = None
self._length = 0 def isEmpty(self):
"""检测是否为空"""
return self._head is None def add(self, value):
"""add在链表前端添加元素:O(1)"""
newnode = Node(value)
newnode.setNext(self._head)
# 注意这里的顺序不能和setNext()颠倒不然新增的节点找不到next
self._head = newnode def append(self, value):
"""append在链表尾部添加元素:O(n)
思路:遍历链表,在原链尾next指向新节点"""
newnode = Node(value)
if self.isEmpty():
# 若为空表,将添加的元素设为第一个元素
self._head = newnode
else:
# 从链首遍历链表
current = self._head
while current.getNext() is not None:
current = current.getNext()
# 找到最后一个,直接设置它的next指向新增的节点
current.setNext(newnode) def size(self):
"""获取链表的元素个数
从链头head开始遍历到链尾,同时用变量累加经过的节点个数"""
current = self._head
while current is not None:
current = current.getNext()
self._length += 1
return self._length def search(self, value):
"""查找元素是否在链表,找到返回True,否则返回False
从链头head开始遍历到链尾,并判断当前节点的数据是否为目标value"""
current = self._head
found = False
while current is not None and not found:
if current.getValue() == value:
found = True
else:
current = current.getNext()
return found def remove(self, value):
"""删除一个元素
遍历链表"""
current = self._head
previous = None
found = False while not found:
if current.getValue() == value:
found = True
# 找到后判断value是不是链首,是的话,head为value的下个节点
if not previous:
self._head = current.getNext()
else:
# 不是的话,将前一个节点的next指向要删除的节点的下一个节点
previous.setNext(current.getNext())
elif current.getNext() is not None:
# 之前的节点指向当前节点
previous = current
# 并找下一个节点作为循环的当前节点
current = current.getNext()
else:
raise ValueError('{} is not in LinkedList'.format(value)) def index(self, value):
"""返回元素在链表的位置,找不到抛出ValueError错误
遍历链表,并用count累加遍历过的每一个节点位置"""
current = self._head
count = 0
found = False while current is not None and not found:
if current.getValue() == value:
found = True
else:
current = current.getNext()
count += 1
if found:
return count
else:
raise ValueError('{} is not in LinkedList'.format(value)) def insert(self, position, value):
"""往链表position位置插入一个元素value"""
# 如果是链首,直接add添加
if position <= 1:
self.add(value)
# 如果是链尾,直接append
elif position > self.size():
self.append(value)
# 中间位置插入,思路也是从头遍历,找到position位置之前一个节点插入
# 并修改previous节点next指向新节点,新节点next指向position位置的节点
else:
temp = Node(value)
previous = None
count = 1
current = self._head
while count < position:
count += 1
previous = current
current = current.getNext() previous.setNext(temp)
temp.setNext(current) if __name__ == '__main__':
link = LinkedList()
link.add(4)
link.add(5)
link.add(6)
link.add(7)
print(link.remove(4))
print(link.size())
python实现一个无序单链表的更多相关文章
- python算法与数据结构-单链表(38)
一.链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括 ...
- python中栈的单链表实现
参考博客:https://www.cnblogs.com/stacklike/p/8284550.html 基于列表的简单实现 # 先进后出 # 以列表实现的简单栈 class SimpleStack ...
- 用最简单的方式学Python单链表
Python 实现单链表 在本博客中,我们介绍单链表这种数据结构,链表结构为基于数组的序列提供了另一种选择(例如Python列表). 基于数组的序列和链表都能够对其中的元素保持一定得顺序,但采用的方式 ...
- 用最容易的方式学会单链表(Python实现)
单链表与数组 在本博客中,我们介绍单链表这种数据结构,链表结构为基于数组的序列提供了另一种选择(例如Python列表). 基于数组的序列也会有如下缺点: 一个动态数组的长度可能超过实际存储数组元素所需 ...
- python单链表
#!/usr/bin/env python3 # -*- coding:utf-8 -*- class LNode: """ 结点类 """ ...
- 将单链表的每K个节点之间逆序
[说明]: 本文是左程云老师所著的<程序员面试代码指南>第二章中“将单链表的每K个节点之间逆序”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解析说明, ...
- PTA 循环单链表区间删除 (15 分)
本题要求实现带头结点的循环单链表的创建和单链表的区间删除.L是一个带头结点的循环单链表,函数ListCreate_CL用于创建一个循环单链表,函数ListDelete_CL用于删除取值大于min小于m ...
- 【链表问题】打卡9:将单链表的每K个节点之间逆序
前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题,相信我,你的坚持,绝对会有意想不到的收获.每道题会提供简单的解答,如果你有更优雅的做法,欢迎提供指点,谢谢. 注:如果代码排版出现了问题麻烦通知我下 ...
- 数据结构——Java实现单链表
一.分析 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点由元素和指针构成.在Java中,我们可以将单链表定义成一个类,单链表的基 ...
随机推荐
- 【转】Python3 正则表达式特殊符号及用法(详细列表)
转载自鱼c论坛:https://fishc.com.cn/forum.php?mod=viewthread&tid=57691&extra=page%3D1%26filter%3Dty ...
- naicat如何查看表关系
1.navict版本为:navict premium https://www.php.cn/tool/navicat/427617.html 参考上面链接 2. 这个版本的 目前就这些,后续进行补充
- rpc服务在游戏中的简单运用
我们最开始做的游戏框架,多数都是client->server->db的模式,但是随着玩家数量的增加,一个server进程就会扛不住,需要多个进程服务于多个玩家.但是给定了不同进程的玩家,有 ...
- PS编辑工具
3.1PS污点修复 (1)快捷键:J. (2)中括号可以改变笔触的大小,前中括号减小笔触,后中括号增加笔触. (3)可以用选区把需要修复的地方框选上,再进行修复,这样不会影响到未选区域. 3.2PS修 ...
- 助力全球抗疫:3D突发公共卫生事件管理平台
前言 秋冬降临,北半球气温转凉.欧洲多个国家单日新增病例持续创新高,美国更是成为全球疫情最严重的国家.国内山东青岛.新疆喀什等地也相继发现多例病情.全球第二波疫情已经开始,国内疫情牵动人心,全球抗疫仍 ...
- js工厂函数
经常会遇到工厂函数这个词,不过javascript不是严格的面向对象语言,不像java,C#拥有类,所以工厂函数会变得比较模糊. 简单来讲,就是创建一个可以用来创建实例的函数,这样每一个实例都是独立的 ...
- MongoDB 监控 --- MongoDB基础用法(八)
MongoDB 监控 在你已经安装部署并允许MongoDB服务后,你必须要了解MongoDB的运行情况,并查看MongoDB的性能.这样在大流量得情况下可以很好的应对并保证MongoDB正常运作. M ...
- 在 k8S 中搭建 SonarQube 7.4.9 版本(使用 PostgreSQL 数据库)
搭建 SonarQube 和 PostgreSQL 服务 本文搭建的 SonarQube 版本是 7.4.9-community,由于在官方文档中声明 7.9 版本之后就不再支持使用 MySQL 数据 ...
- Docker composer搭建Spring Cloud Alibaba 运行环境(二)
" Spring Cloud Alibaba要用到的组件很多,注册中心nacos, 限流sentinel, 数据库,网关等等.由于用到的组件相对较多,部署会很繁琐,最关键的是没有资源服务器, ...
- Java学习的第二天
1.今天学习了变量与常量看了大道至简 字节型:byte 1字节 短整型:short 2字节 整型:int 4字节长整型:long 8字节单精度浮点型:float 4字节双精度浮点型:double 8 ...