python中的单向链表实现
引子
数据结构指的是是数据的组织的方式。从单个数据到一维结构(线性表),二维结构(树),三维结构(图),都是组织数据的不同方式。
为什么需要链表?
顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁,所以使用起来并不是很灵活。
链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。
什么是单链表?
单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。
单链表应当支持哪些基本操作?
- is_empty() 链表是否为空
- length() 链表长度
- travel() 遍历整个链表
- add(item) 链表头部添加元素
- append(item) 链表尾部添加元素
- insert(pos, item) 指定位置添加元素
- remove(item) 删除节点
- search(item) 查找节点是否存在
操作图解:
add
insert
remove
代码实现
注意点:
因为没有计数,因此诸多操作都离不开遍历,何时停止不可迷糊。另外,不要忘记经常要考虑的特殊情况。如果为空会如何?如果链表中只有一个节点会如何?构造新链时,该遵循怎样的顺序?(先保证原链不断)
- class Node(object):
- def __init__(self, value):
- # 元素域
- self.value = value
- # 链接域
- self.next = None
- class LinkedListOneway(object):
- def __init__(self, node=None):
- self.__head = node
- def __len__(self):
- # 游标,用来遍历链表
- cur = self.__head
- # 记录遍历次数
- count = 0
- # 当前节点为None则说明已经遍历完毕
- while cur:
- count += 1
- cur = cur.next
- return count
- def is_empty(self):
- # 头节点不为None则不为空
- return self.__head == None
- def add(self, value):
- """
- 头插法
- 先让新节点的next指向头节点
- 再将头节点替换为新节点
- 顺序不可错,要先保证原链表的链不断,否则头节点后面的链会丢失
- """
- node = Node(value)
- node.next = self.__head
- self.__head = node
- def append(self, value):
- """尾插法"""
- node = Node(value)
- cur = self.__head
- if self.is_empty():
- self.__head = node
- else:
- while cur.next:
- cur = cur.next
- cur.next = node
- def insert(self, pos, value):
- # 应对特殊情况
- if pos <= 0:
- self.add(value)
- elif pos > len(self) - 1:
- self.append(value)
- else:
- node = Node(value)
- prior = self.__head
- count = 0
- # 在插入位置的前一个节点停下
- while count < (pos - 1):
- prior = prior.next
- count += 1
- # 先将插入节点与节点后的节点连接,防止链表断掉,先链接后面的,再链接前面的
- node.next = prior.next
- prior.next = node
- def remove(self, value):
- cur = self.__head
- prior = None
- while cur:
- if value == cur.value:
- # 判断此节点是否是头节点
- if cur == self.__head:
- self.__head = cur.next
- else:
- prior.next = cur.next
- break
- # 还没找到节点,有继续遍历
- else:
- prior = cur
- cur = cur.next
- def search(self, value):
- cur = self.__head
- while cur:
- if value == cur.value:
- return True
- cur = cur.next
- return False
- def traverse(self):
- cur = self.__head
- while cur:
- print(cur.value)
- cur = cur.next
python中的单向链表实现的更多相关文章
- python中的单向循环链表实现
引子 所谓单向循环链表,不过是在单向链表的基础上,如响尾蛇般将其首尾相连,也因此有诸多类似之处与务必留心之点.尤其是可能涉及到头尾节点的操作,不可疏忽. 对于诸多操所必须的遍历,这时的条件是什么?又应 ...
- python数据结构链表之单向链表
单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...
- Python链表的实现与使用(单向链表与双向链表)
参考[易百教程]用Python实现链表及其功能 """ python链表的基本操作:节点.链表.增删改查 """ import sys cl ...
- 用python实现单向链表
单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...
- 用Python写单向链表和双向链表
链表是一种数据结构,链表在循环遍历的时候效率不高,但是在插入和删除时优势比较大. 链表由一个个节点组成. 单向链表的节点分为两个部分:存储的对象和对下一个节点的引用.注意是指向下一个节点. 而双向链表 ...
- python数据结构——单向链表
链表 ( Linked List ) 定义:由许多相同数据类型的数据项按照特定顺序排列而成的线性表. 特点:各个数据在计算机中是随机存放且不连续. 优点:数据的增删改查都很方便,当有新的数据加入的时候 ...
- python中的数据结构-链表
一.什么是链表 链表是由一系列节点构成,每个节点由一个值域和指针域构成,值域中存储着用户数据,指针域中存储这指向下一个节点的指针.根据结构的不同,链表可以分为单向链表.单向循环链表.双向链表.双向循环 ...
- 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点
第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;Lis ...
- 输出单向链表中倒数第k个结点
描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 链表结点定义如下: struct ListNode { int m_nKey; ListNode* ...
随机推荐
- jQuery的一些基本的函数和用jQuery做一些动画操作
jQuery是对js的封装,因为js有一些不方便的地方.所以,jQuery才会去对js进行封装. jQuery对于标签元素的获取 $('div')或$('li') <!DOCTYPE html& ...
- E: Unable to locate package clang-7 E: Unable to locate package clang++-7 E: Couldn't find any package by regex 'clang++-7'
我的系统是Debian 9.8, 然后在装下面这两个包的时候老是提示找不到.然后再github上一问,过了几分钟就有大佬回复了,而且亲测有效 ~$ sudo apt-get -y install cl ...
- 通用RSA加密 - PHP+Java+Javascript加密解密
php端生成 公钥私钥 1.openssl genrsa -out rsa_private_key.pem 1024 私钥 2.openssl rsa -in rsa_private_key.p ...
- SHOT
- 理解 Linux 的硬链接与软链接【转】
转自:https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/index.html 从 inode 了解 Linux 文件 ...
- 2019 icpc南昌全国邀请赛-网络选拔赛J题 树链剖分+离线询问
链接:https://nanti.jisuanke.com/t/38229 题意: 给一棵树,多次查询,每次查询两点之间权值<=k的边个数 题解: 离线询问,树链剖分后bit维护有贡献的位置即可 ...
- I/O多路复用之select、poll、epoll
很早之前有写过篇IO多路复用的文章:https://www.cnblogs.com/klcf0220/archive/2013/05/14/3077003.html 参考链接:https://segm ...
- Android 插件化和热修复知识梳理
概述 在Android开发中,插件化和热修复的话题越来越多的被大家提及,同时随着技术的迭代,各种框架的发展更新,插件化和热修复的框架似乎已经日趋成熟,许多开发者也把这两项技术运用到实际开发协作和正式的 ...
- 利用 Google Chart API 生成二维码大小不一致
大小不一致是由于 chl 参数内容不一样导致的,而 chs 参数只能指定生成图片的大小,不能指定生成具体二维码大小. 比如:https://chart.googleapis.com/chart?ch ...
- TensorFlow object detection API
cloud执行:https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_pet ...