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实现一个无序单链表的更多相关文章

  1. python算法与数据结构-单链表(38)

    一.链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括 ...

  2. python中栈的单链表实现

    参考博客:https://www.cnblogs.com/stacklike/p/8284550.html 基于列表的简单实现 # 先进后出 # 以列表实现的简单栈 class SimpleStack ...

  3. 用最简单的方式学Python单链表

    Python 实现单链表 在本博客中,我们介绍单链表这种数据结构,链表结构为基于数组的序列提供了另一种选择(例如Python列表). 基于数组的序列和链表都能够对其中的元素保持一定得顺序,但采用的方式 ...

  4. 用最容易的方式学会单链表(Python实现)

    单链表与数组 在本博客中,我们介绍单链表这种数据结构,链表结构为基于数组的序列提供了另一种选择(例如Python列表). 基于数组的序列也会有如下缺点: 一个动态数组的长度可能超过实际存储数组元素所需 ...

  5. python单链表

    #!/usr/bin/env python3 # -*- coding:utf-8 -*- class LNode: """ 结点类 """ ...

  6. 将单链表的每K个节点之间逆序

    [说明]: 本文是左程云老师所著的<程序员面试代码指南>第二章中“将单链表的每K个节点之间逆序”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解析说明, ...

  7. PTA 循环单链表区间删除 (15 分)

    本题要求实现带头结点的循环单链表的创建和单链表的区间删除.L是一个带头结点的循环单链表,函数ListCreate_CL用于创建一个循环单链表,函数ListDelete_CL用于删除取值大于min小于m ...

  8. 【链表问题】打卡9:将单链表的每K个节点之间逆序

    前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题,相信我,你的坚持,绝对会有意想不到的收获.每道题会提供简单的解答,如果你有更优雅的做法,欢迎提供指点,谢谢. 注:如果代码排版出现了问题麻烦通知我下 ...

  9. 数据结构——Java实现单链表

    一.分析 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点由元素和指针构成.在Java中,我们可以将单链表定义成一个类,单链表的基 ...

随机推荐

  1. Topsis优劣解距离法 mlx代码

    请参考https://blog.csdn.net/qq_36384657/article/details/98188769 mlx代码 topsis 优劣解距离法 参数说明: 分数.获奖次数.价值等 ...

  2. c++ qsort的使用

    c++ qsort的使用 qsort函数定义在头文件algorithm中,使用时需要include该头文件 void qsort (void* base, size_t num, size_t siz ...

  3. Sentinel流控规则

    流控规则 注:Sentinel的监控页面一开始是没有东西,需要对监控的服务发起请求后才会出现 资源名:唯一名称,默认请求路径 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,指定对哪个 ...

  4. 习题解答chapter04

    题目: 实验:利用IDE的debug功能给例6.4和例6.6的new语句设置断点,使用单步调试(step into/step over)跟踪子类对象实例化(初始化)的执行顺序,并总结该过程.(教材:J ...

  5. 图的全部实现(邻接矩阵 邻接表 BFS DFS 最小生成树 最短路径等)

    1 /** 2 * C: Dijkstra算法获取最短路径(邻接矩阵) 3 * 6 */ 7 8 #include <stdio.h> 9 #include <stdlib.h> ...

  6. python的deque(双向)队列详解

    首先 python的队列有很多种 Python标准库中包含了四种队列,分别是queue.Queue / asyncio.Queue / multiprocessing.Queue / collecti ...

  7. Redis的一些问题

    date: 2020-10-15 10:58:00 updated: 2020-10-19 18:00:00 Redis的一些问题 Remote Dictionary Server 底层C写的 类似于 ...

  8. CTF-misc:老板,再来几道misc玩玩

    [BJDCTF 2nd]最简单的misc-y1ng 得到一个图片,提示格式损坏,修补一下文件头 然后得到一张图片 直接python16进制转字符串 >>> string = &quo ...

  9. nginx负载均衡常见问题配置信息

    nginx为后端web服务器(apache,nginx,tomcat,weblogic)等做反向代理 几台后端web服务器需要考虑文件共享,数据库共享,session共享问题.文件共享可以使用nfs, ...

  10. python爬虫scrapy框架

    Scrapy 框架 关注公众号"轻松学编程"了解更多. 一.简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量 ...