摘要:数据结构实现链表简单介绍链表是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针。图解如下查找通过遍历链表,使用标记是否找到了正在寻找的项。一旦为,就是对包含要删除的项的节点的引用。
Python数据结构实现—链表 1. 简单介绍
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。—— 维基百科
链表的基本构造块是节点(Node)。我们将在文章的第2部分通过Python实现一个简单的Node类。
一个单向链表的构造如下图1所示包含两个域:
信息域:当前节点的值(Data or Value)
指针域:指向下一个节点的指针链接(Reference or Link)
注1:必须明确指定链表的第一项的位置。一旦我们知道第一项在哪里,第一项目可以告诉我们第二项是什么,依次类推。按照一个方向遍历,直到最后一项(最后一个节点),最后一项需要知道没有下一项。
注2:这些节点在逻辑上是相连的,但要知道它们在物理内存上并不相连。
我们先来实现Node类:
class Node(object): def __init__(self, initdata): self.data = initdata # 引用None代表没有下一节点 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对象试试:
>>> tmp = Node(33) >>> tmp <__main__.Node object at 0x1022699b0> >>> tmp.getData() 332.2 Unordered List类
只要知道第一个节点(包含第一个项),那么之后的每个节点都可以通过指向下一个节点的链接 依次找到。
考虑到这样的情况,Unordered List类只要维护对第一个节点的引用就可以了。Unordered List类本身不包含任何节点对象,它只包含对链表结构中第一个节点的单个引用!
class unOrderedList(): def __init__(self): # 初始化None表示此时链表的头部不引用任何内容 self.head = None
创建一个空的链表试试(如图2所示):
>>> myList = unOrderedList()
我们可通过下面的 isEmpty() 方法检查是否为空链表:
# 只有在链表中没有节点的时候为真 def isEmpty(self): return self.head == None
添加元素后的链表是这样的(如图3所示),稍后在文章第3部分实现添加方法:
由于是在前端添加,因此最后添加的在最前端。
def add(self, item): temp = Node(item) # Step0:创建一个新节点并将新项作为数据 temp.setNext(self.head) # Step1:更改新节点的下一个引用以引用旧链表的第一个节点 self.head = temp # Step2:重新设置链表的头以引用新节点
添加元素——执行mylist.add(26)时候的图解如下:
>>> mylist.add(31) >>> mylist.add(77) >>> mylist.add(17) >>> mylist.add(93) >>> mylist.add(26)3.2 size()求链表长度
def size(self): current = self.head count = 0 while current != None: count += 1 current = current.getNext() return count
通过current遍历链表并对节点计数。
图解如下:
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
通过current遍历链表,使用found标记是否找到了正在寻找的项。
图解如下:
def remove(self, item): current = self.head previous = None found = False while not found: if current.getData() == item: found = True else: previous = current current = current.getNext() if previous == None: # 当要删除的项目恰好是链表中的第一个项,这时候prev是None,需要修改head以引用current之后的节点 self.head = current.getNext() else: previous.setNext(current.getNext())
我们遍历链表,先搜索,再删除。
1.搜索:
使用previous与current进行移动,借助found标记是否找到。
一旦found为True,current就是对包含要删除的项的节点的引用。
2.删除(修改引用):
我们把previous的对下一节点的引用设为current的下一节点。
以上两过程的图解如下:
参考:
problem-solving-with-algorithms-and-data-structure-using-python
python-wikipedia
如有错误,还望指正~
完整实现及测试可在Github找到:Python-DataStructure-Implementation
感谢。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/40766.html
摘要:解决按学生年龄排序的实际问题问题定义一个包含姓名性别年龄,需要按年龄给学生排序。输出按照年龄进行排序好的。思路使用冒泡排序,比较相邻的学生,如果第一个学生的值比第二个学生的值大,那么就整体交换这两个元素。 Python解决按学生年龄排序的实际问题 问题:定义一个Class:包含姓名name、性别gender、年龄age,需要按年龄给学生排序。输入:包含学生对象的List。输出:按照年龄...
摘要:线性表的和采用了顺序表的实现技术,具有顺序表的所有性质。删除链表应丢弃这个链表里的所有结点。在语言中,就是检查相应变量的值是否为。也就是说,插入新元素的操作是通过修改链接,接入新结点,从而改变表结构的方式实现的。 1.线性表 Python的list和tuple采用了顺序表的实现技术,具有顺序表的所有性质。 2.链接表 单向链接表 的结点是一个二元组。 其表元素域elem保存着作为表元素...
摘要:前言在上一章中我们介绍了的一些内部原理在这一章中我们再来讨论在五种数据结构中的基本使用和一些内部实现基本介绍的呢相当于中的也是双向链表具有一些和同样的特征比如插入和删除一条很快时间复杂度为获取头结点和尾节点也很快时间复杂度也为随机读取则相对 前言 在上一章中我们介绍了 String 的一些内部原理,在这一章中我们再来讨论在五种数据结构中 List 的基本使用和一些内部实现. 基本介绍 ...
阅读 3257·2021-10-11 10:59
阅读 2812·2021-10-11 10:58
阅读 2244·2021-09-04 16:45
阅读 2716·2019-08-30 15:44
阅读 671·2019-08-30 15:44
阅读 3198·2019-08-30 10:51
阅读 1597·2019-08-29 18:46
阅读 2748·2019-08-29 13:57