python有序列表无序列表区别_python实现无序列表:链表

介绍链表前我们先了解下什么是列表。

在对基本数据结构的讨论中,我们使用 Python 列表来实现所呈现的抽象数据类型。列表是一个强大但简单的收集机制,为程序员提供了各种各样的操作。然而,不是所有的编程语言都包括列表集合。在这些情况下,列表的概念必须由程序员实现。

列表是项的集合,其中每个项保持相对于其他项的相对位置。更具体地,我们将这种类型的列表称为无序列表。我们可以将列表视为具有第一项,第二项,第三项等等。我们还可以引用列表的开头(第一个项)或列表的结尾(最后一个项)。为了简单起见,我们假设列表不能包含重复项。

例如,整数 54,26,93,17,77 和 31 的集合可以表示考试分数的简单无序列表。请注意,我们将它们用逗号分隔,这是列表结构的常用方式。当然,Python 会显示这个列表为 [54,26,93,17,77,31]。

1 无序列表抽象数据类型

如上所述,无序列表的结构是项的集合,其中每个项保持相对于其他项的相对位置。下面给出了一些可能的无序列表操作。

List() 创建一个新的空列表。它不需要参数,并返回一个空列表。

add(item) 向列表中添加一个新项。它需要 item 作为参数,并不返回任何内容。假定该 item 不在列表中。

remove(item) 从列表中删除该项。它需要 item 作为参数并修改列表。假设项存在于列表中。

search(item) 搜索列表中的项目。它需要 item 作为参数,并返回一个布尔值。

isEmpty() 检查列表是否为空。它不需要参数,并返回布尔值。

size()返回列表中的项数。它不需要参数,并返回一个整数。

append(item) 将一个新项添加到列表的末尾,使其成为集合中的最后一项。它需要 item

作为参数,并不返回任何内容。假定该项不在列表中。

index(item) 返回项在列表中的位置。它需要 item 作为参数并返回索引。假定该项在列表中。

insert(pos,item) 在位置 pos 处向列表中添加一个新项。它需要 item作为参数并不返回任何内容。假设该项不在列表中,并且有足够的现有项使其有 pos 的位置。

pop() 删除并返回列表中的最后一个项。假设该列表至少有一个项。

pop(pos) 删除并返回位置 pos 处的项。它需要 pos 作为参数并返回项。假定该项在列表中。

2 python实现无序列表

为了实现无序列表,我们将构造通常所知的链表,外部引用通常被称为链表的头。

2.1 Node类

节点(Node)是链表实现的基本构造,由列表项(item,数据字段)和对下一个节点的引用组成。Node 类包括访问,修改数据和访问下一个引用等常用方法。类的代码如下:

class Node:

def __init__(self,initdata):

self.data = initdata

self.next = None

def getData(self):

return self.data

def getNext(self):

return self.next

def setData(self,newdata):

self.data = newdata

def setNext(self,newnext):

self.next = newnext

我们创建一个 Node 对象

temp = Node(93)

Python 引用值 None 将在 Node 类和链表本身发挥重要作用。引用 None 代表没有下一个节点。请注意在构造函数中,最初创建的节点 next 被设置为 None。有时这被称为 接地节点,因此我们使用标准接地符号表示对 None 的引用,如下图:

L3Byb3h5L2h0dHBzL2ltZy1ibG9nLmNzZG4ubmV0LzIwMTcxMjMwMTUyOTUyMzgxP3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdmJUQmZNemN6TWpRM05EQT0vZm9udC81YTZMNUwyVC9mb250c2l6ZS80MDAvZmlsbC9JMEpCUWtGQ01BPT0vZGlzc29sdmUvNzAvZ3Jhdml0eS9Tb3V0aEVhc3Q=.jpg

2.2 Unordered List 类

如上所述,无序列表将从一组节点构建,每个节点通过显式引用链接到下一个节点。只要我们知道在哪里找到第一个节点(包含第一个项),之后的每个项可以通过连续跟随下一个链接找到。考虑到这一点,UnorderedList 类必须保持对第一个节点的引用,如下图所示,实现代码如下:

L3Byb3h5L2h0dHBzL2ltZy1ibG9nLmNzZG4ubmV0LzIwMTcxMjMwMTUzODIwOTMyP3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdmJUQmZNemN6TWpRM05EQT0vZm9udC81YTZMNUwyVC9mb250c2l6ZS80MDAvZmlsbC9JMEpCUWtGQ01BPT0vZGlzc29sdmUvNzAvZ3Jhdml0eS9Tb3V0aEVhc3Q=.jpg

class UnorderedList:

def __init__(self):

self.head = None

def isEmpty(self):

return self.head == None

def add(self,item):

temp = Node(item)

#更改新节点的下一个引用以引用旧链表的第一个节点

temp.setNext(self.head)

#赋值语句设置列表的头

self.head = temp

#访问和赋值的顺序不能颠倒,因为head是链表节点唯一的外部引用,颠倒将导致所有原始节点丢失并且不能再被访问

def size(self):

current = self.head

count = 0

while current != None:

count = count + 1

current = current.getNext()

return count

def search(self,item):

current = self.head

found = False

while current != None and not found:

if current.getData() == item:

found = True

else:

current = current.getNext()

return found

def remove(self,item):

current = self.head

previous = None

found = False

while not found:

if current.getData() == item:

found = True

#previous 必须先将一个节点移动到 current 的位置。此时,才可以移动current

else:

previous = current

current = current.getNext()

#如果要删除的项目恰好是链表中的第一个项,链表的 head 需要改变

if previous == None:

self.head = current.getNext()

else:

previous.setNext(current.getNext())

2.2.1 add function

链表结构只为我们提供了一个入口点,即链表的头部。所有其他节点只能通过访问第一个节点,然后跟随下一个链接到达。这意味着添加新节点的最简单的地方就在链表的头部。 换句话说,我们将新项作为链表的第一项,现有项将需要链接到这个新项后。

2.2.2 链表遍历技术——size,search,remove方法

size方法实现思路如下图:

L3Byb3h5L2h0dHBzL2ltZy1ibG9nLmNzZG4ubmV0LzIwMTcxMjMwMTU0MzQ3OTc2P3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdmJUQmZNemN6TWpRM05EQT0vZm9udC81YTZMNUwyVC9mb250c2l6ZS80MDAvZmlsbC9JMEpCUWtGQ01BPT0vZGlzc29sdmUvNzAvZ3Jhdml0eS9Tb3V0aEVhc3Q=.jpg

remove方法实现思路如下图:

L3Byb3h5L2h0dHBzL2ltZy1ibG9nLmNzZG4ubmV0LzIwMTcxMjMwMTU1MDIzMDM3P3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdmJUQmZNemN6TWpRM05EQT0vZm9udC81YTZMNUwyVC9mb250c2l6ZS80MDAvZmlsbC9JMEpCUWtGQ01BPT0vZGlzc29sdmUvNzAvZ3Jhdml0eS9Tb3V0aEVhc3Q=.jpg

L3Byb3h5L2h0dHBzL2ltZy1ibG9nLmNzZG4ubmV0LzIwMTcxMjMwMTU1MDMyNjczP3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdmJUQmZNemN6TWpRM05EQT0vZm9udC81YTZMNUwyVC9mb250c2l6ZS80MDAvZmlsbC9JMEpCUWtGQ01BPT0vZGlzc29sdmUvNzAvZ3Jhdml0eS9Tb3V0aEVhc3Q=.jpg

remove 方法需要两个逻辑步骤。

第一步搜索,第二部删除。

但是current实际指向的是目标节点的引用,直接删除会删除前一个节点,因此引入previous这个外部引用。

参考资料:《problem-solving-with-algorithms-and-data-structure-using-python》

http://www.pythonworks.org/pythonds

python 实现无序列表

# -*- coding:utf-8 -*- class Node: def __init__(self, initdata): self.data = initdata self.next = No ...

Python实践练习:在 Wiki 标记中添加无序列表

题目描述 项目:在 Wiki 标记中添加无序列表 在编辑一篇维基百科的文章时,你可以创建一个无序列表,即让每个列表项占据一行,并在前面放置一个星号.但是假设你有一个非常大的列表,希望添加前面的星号.你 ...

python---用链表结构实现有序和无序列表的几个功能

只是看看套路,没有深入练习. 如果真要自己写,可以基于此类. 但其实,在普通使用中,这样实现的性能,并没有python原生的列表性能好. 因为python原生列表的功能,是基于数组作扩展实现的. # ...

Python中将字典转换为有序列表、无序列表的方法

说明:列表不可以转换为字典 1.转换后的列表为无序列表 a = {'a' : 1, 'b': 2, 'c' : 3} #字典中的key转换为列表 key_value = list(a.keys()) ...

[转载]Python 元组、列表、字典、文件

python的元组.列表.字典数据类型是很python(there python is a adjective)的数据结构.这些结构都是经过足够优化后的,所以如果使用好的话,在某些area会有很大的益 ...

在 Wiki 标记中添加无序列表

项目:在 Wiki 标记中添加无序列表在编辑一篇维基百科的文章时,你可以创建一个无序列表,即让每个列表项占据一行,并在前面放置一个星号.但是假设你有一个非常大的列表,希望添加前面的星号.你可以在每一行 ...

Python基础数据类型-列表(list)和元组(tuple)和集合(set)

Python基础数据类型-列表(list)和元组(tuple)和集合(set) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客使用的是Python3.6版本,以及以后分享的 ...

【Python算法】列表中的 append 比 insert 效率高的实质

append 与 insert 对比: # append 操作 >>> count = 10**5 >>> nums = [] >>> for i ...

Python基本数据类型--列表、元组、字典、集合

一.Python基本数据类型--列表(List) 1.定义:[ ]内以逗号分隔,按照索引,存放各种数据类型,每个位置代表一个元素. 2.列表的创建: # 方式一 list1 = ['name','ag ...

随机推荐

《HBase实战》

对,我正在研读这本书,今天开始,我希望我看完后能有收获和大家分享,这个日志作为开始,勉励自己! 对,我应该静下心,做一些我更喜欢的事情,不能在自我陶醉中迷失! 断断续的看,到今天大概把这本书看完了,没 ...

异常处理与MiniDump详解(4) MiniDump

http://blog.csdn.net/vagrxie/article/details/4398721 异常处理与MiniDump详解(4) MiniDump 分类:             [Wi ...

css3 选择器记

css3 选择器 根据所获取页面中元素的不同,把css3选择器分为五大类: 基本选择器 层次选择器 伪类选择器 动态伪类选择器 目标伪类选择器 语言伪类选择器 UI元素状态伪类选择器 结构伪类选择器 ...

ReactNative-----环境搭建二(android)

一.初始化一个ReactNative项目 在指定目录运行命令:react-native init Vince(项目名称)  //其过程就是在使用CLI工具构建项目, 命令行代码 F:\React&gt ...

虚拟机使用PuTTY、SSH Secure Shell Client前的配置

1 仅主机模式 2 检查子网IP 为192.168.154.0 3 进入虚拟机,检查IP地址 ip addr show 添加IP地址 ip addr add dev eno16777736 192.1 ...

webstorm与phpstorm主题配置

原创. 更换webstorm的主题的,照着网上的教程试了好多次都发现不行,而且我之前有个同学也是这样的问题,找不到相关的colors文件夹,所以在网上教程的基础上对于更改主题做了细微的修改. 1.下载 ...

DirectFB学习笔记一

本文记录directfb程序的基本操作流程. 1.首先创建一个directfb对象:DirectFBInit(&argc,&argv)初始化然后创建DirectFBCreate(&am ...

几个 Cookie 操作例子的分析

MDN 上提供了操作 Cookie 的若干个例子,也有一个简单的 cookie 框架,今天尝试分析一下,最后是 jquery-cookie 插件的分析. document.cookie 的操作例子 例 ...

C#中的协变(Covariance)和逆变(Contravariance)

摘要 ● 协变和逆变的定义是什么?给我们带来了什么便利?如何应用? ● 对于可变的泛型接口,为什么要区分成协变的和逆变的两种?只要一种不是更方便吗? ● 为什么还有不可变的泛型接口,为什么有的泛型接口 ...

Linux 远程工具Screen 的应用

挂断原理参考:https://www.ibm.com/developerworks/cn/linux/l-cn-screen/ 要求,python2 常用操作: 创建screen screen -L ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值