数据结构与算法Python版 无序表的链表实现


一、无序表

无序表Unordered List

  • 无序表中的数据项只按照存放位置来索引,从第1个、第2个…到最后一个。为了简单起见,约定无序表中不存在重复数据项。例如一个考试分数的集合54, 26, 93, 17,77和31

抽象数据类型:无序表

方法名 描述 备注
List() 创建一个空列表
add(item) 添加一个数据项到列表中 假设item原先不存在于列表中
remove(item) 从列表中移除item 列表被修改,item原先应存在于表中(删除成功返回True,若item不存在返回False)
search(item) 在列表中查找item,返回布尔类型值
isEmpty() 返回列表是否为空
size() 返回列表包含了多少数据项
append(item) 添加一个数据项到表末尾 假设item原先不存在于列表中
index(item) 返回数据项在表中的位置 (若item不存在返回False)
insert(pos, item) 将数据项插入到位置pos 假设item原先不存在与列表中,同时原列表具有足够多个数据项,能让item占据位置pos。(若原列表没有足够多的数据返回False)
pop() 从列表末尾移除数据项 假设原列表至少有1个数据项(若原列表为空返回False)
pop(pos) 移除位置为pos的数据项 假设原列表存在位置pos。(若原列表没有足够多的数据返回False)

二、采用链表实现无序表

分析

  • 虽然无序表要求保持数据项的前后相对位置,但这种前后位置的保持,并不要求数据项依次存放在连续的存储空间
  • 链表实现的最基本元素是节点Node。每个节点至少要包含2个信息:数据项本身,以及指向下一个节点的引用信息。当next为None表示没有下一个节点了。
  • 链表的第一个和最后一个节点最重要。如果想访问到链表中的所有节点,就必须从第一个节点开始沿着链接遍历下去。
  • 无序表必须要有对第一个节点的引用信息。设立一个属性head,保存对第一个节点的引用,空表的head为None
    在这里插入图片描述

算法描述

  • add(item)方法:由链表结构我们知道,要访问到整条链上的所有数据项,都必须从表头head开始沿着next链接逐个向后查找。所以添加新数据项最快捷的位置是表头
  • size()方法:从链条头head开始遍历到表尾,同时用变量累加经过的节点个数
  • search(item)方法:从链表头head开始遍历到表尾,同时判断当前节点的数据项是否目标
  • remove(item)方法:删除需要把前一个节点的next指向current的下一个节点。找到item之后,current指向item节点,previous指向前一个节点。开始执行删除,需要区分两种情况:current是首个节点,或者是位于链条中间的节点。
    在这里插入图片描述

采用链表实现抽象数据类型无序表

class Node:
    def __init__(self, data, next=None):
        self.data = data
        self.next = next

    def get_data(self):
        return self.data

    def get_next(self):
        return self.next

    def set_data(self, new_data):
        self.data = new_data

    def set_next(self, new_next):
        self.next = new_next


class UnorderedList:
    def __init__(self, head=None):
        self.head = head

    def is_empty(self):
        return self.head == None

    def add(self, item):
        temp = Node(item, self.head)
        self.head = temp

    def size(self):
        count = 0
        current = self.head
        while current != None
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值