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中,我们可以将单链表定义成一个类,单链表的基 ...
随机推荐
- 判断是否是胖子的shell脚本
read -p "请输入身高(m为单位): " HIGH if [[ ! "$HIGH" =~ [1].?[0-9]{,2}$ ]];then echo &qu ...
- [开源] .Net ORM FreeSql 1.10.0 稳步向行
写在开头 FreeSql 是 .NET 开源生态下的 ORM 轮子,转眼快两年了,说真的开源不容易(只有经历过才明白).今天带点干货和湿货给大家,先说下湿货. 认识我的人,知道 CSRedisCore ...
- 如何使用性能分析工具定位SQL执行慢的原因?
但实际上 SQL 执行起来可能还是很慢,那么到底从哪里定位 SQL 查询慢的问题呢?是索引设计的问题?服务器参数配置的问题?还是需要增加缓存的问题呢?性能分析来入手分析,定位导致 SQL 执行慢的原因 ...
- python随机生成经纬度(用于爬虫参数伪造)
import random import math def generate_random_gps(base_log=None, base_lat=None, radius=None): radius ...
- 基于gin的golang web开发:模型绑定
在前两篇文章介绍路由的时候,我们了解到gin可用通过类似DefaultQuery或DefaultPostForm等方法获取到前端提交过来的参数.参数不多的情况下也很好用,但是想想看,如果接口有很多个参 ...
- 关于“Cannot resolve table 'user'”报错的问题解决
springboot+vue建立映射时,后端引用@Table(name="user") 来对应表名 user,但引用后报错"Cannot resolve table 'u ...
- MongoDB分片 --- MongoDB基础用法(六)
分片 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求. 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量. ...
- 【tensorflow】VMware Ubuntu+Tensorflow配置和使用
本文主要是记录配置tf环境和虚拟机时遇到的问题和方法,方便日后再查找(补前三年欠下的技术债) 宿主机环境:win10 64位 宿主机python: anaconda+python3.6 宿主机tens ...
- Linux exec族函数解析
背景 在提到 vfork 函数时,我们提到了这个概念.为了更好地学习与运用,我们对exec族函数进行展开. exec函数族 介绍 有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中 ...
- 揭秘仿比心app源码的开发背后,功能是如何实现的
约单陪玩系统作为最近兴起的开发热点,引起了竞相开发,其中比心源码可以说是行业内运营级别的APP中功能比较齐全的,那么仿比心app源码的功能是如何实现的呢,接下来就带大家简单分析一下. 仿比心app源码 ...