Python 数据结构与算法 4链表实现无序列表

列表List:什么是列表?

列表是一种数据项按照相对位置存在的数据集
特别的,被称为“无序表 unordered list”,其中数据项只按照存放位置来索引
如一个考试分数的集合‘54,26,93,17,77和31’ 如果用无序表来表示,就是
[54,26,93,17,77,31]
ADT 无序列表

  • List():创建一个空列表

  • add(item):添加一个数据项到列表中,假设item原先不存在列表中

  • remove(item):从列表中移除item,列表被修改,item原先应存在于表中

  • search(item):在列表中查找item,返回布尔类型值

  • isEmpty():返回列表是否为空

  • size():返回列表包含了多少数据项

  • append(item):添加一个数据项到表末尾,假设item原先不存在于列表中

  • index(item):返回数据项在表中的位置

  • insert(pos,item):将数据项插入到位置pos,假设item原先不存在于列表中,同时原列表具有足够多个数据项,能让item占据位置pos

  • pop():从列表末尾移除数据项,假设原列表至少有1个数据项

  • pop(pos):移除位置为pos的数据项

链表

实现列表的常用方式就是基于链接结构,用链接关系显示表示元素之间的关联。采用链接方式实现的基本思想如下:

  • 把表中的元素分别存储在一批独立的存储块(称为表的结点)里。
  • 保证从组成表结构中的任一个结点可找到与其相关的下一个结点
  • 在前一个结点里用链接的方式显示地记录与下一结点之间的关联

为了实现无序表数据结构,可以采用链接表的方案
虽然列表数据结构要求保持数据项的前后相对位置,但这种前后位置的保持,并不要求数据项一次存放在连续的存储空间
如下图,数据项存放位置并没有规则,但如果在数据项之间建立链接指向,就可以保持其前后相对位置
第一个和最后一个数据项需要显示标记出来,一个是队首,一个是队尾,后面再无数据了
在这里插入图片描述

结点Node

每个节点,至少要包含2个信息:数据项本身,以及指向下一个节点的引用信息
注意next为None的意义是没有下一个节点了,这个很重要

加粗样式
即表item保存着作为表元素的数据项(或者数据项的关联信息),链接域next里保存同一个表的下一个结点的标识

节点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

无序表的实现

链表的第一个和最后一个节点最重要
如果想访问到链表中的所有节点,就必须从第一个节点开始沿着链接遍历下去
无序表必须要有到第一个节点的引用信息

  • 表头head的实现
class Ulist:
    def __init__(self):
        self.head = None #设立一个属性head,保存对第一个节点的引用空表的head为None
      

- isEmpty 的实现

随着数据项的加入,无序表的head始终指向链条中的第一个节点,所以判断isEmpty:

def isEmpty(self):
	return self.head == None
  • add实现

定义添加数据项add方法:从表头添加 即将next指向self.head,head指向要加入的

def add(self,item):
	temp = Node(item)
	temp.setNext(self.head)
	self.head = temp
  • size实现
    从链表头head开始遍历到表尾同时用变量累加经过的节点的个数
    在这里插入图片描述
    def size(self):
        current = self.head
        count = 0
        while current != None:
            count = count+1
            current = current.getNext()
        return count
  • search方法
    从链表头head 开始遍历到表
    在这里插入图片描述
    def search(self,item):
        current = self.head
        found = False
        while current != None :
            if current.getData() ==item:
                found = True
                break
            else:
                current = current.getNext()
        return found
  • remove(item)方法

与search方法类似,首先用current 找到 目标值,使得current前一个结点指向current后一个节点,这样我们要多一个节点的引用 previous

 def remove(self,item):
        current = self.head
        previous = None
        found = False
        while current != None and not found:
            if current.getData() == item:
                found = True
            else:
                previous = current
                current = current.getNext()
        if previous == None:
            self.head = current.getNext()
        else:
            previous.setNext(current.getNext())

无序表代码实现

综上

class Ulist:
    def __init__(self):
        self.head = None
    def isEmpty(self):
        return self.head == None
    def add(self,item):
        N = Node(item)
        N.setNext(self.head)
        self.head = N
    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 :
            if current.getData() ==item:
                found = True
                break
            else:
                current = current.getNext()
        return found
    def remove(self,item):
        current = self.head
        previous = None
        found = False
        while current != None and not found:
            if current.getData() == item:
                found = True
            else:
                previous = current
                current = current.getNext()
        if previous == None:
            self.head = current.getNext()
        else:
            previous.setNext(current.getNext())

u=Ulist()
u.add(45)
u.add(48)
u.add(86)
u.remove(48)
print(u.search(45))
print(u.search(86))
print(u.size())
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值