欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

数据结构与算法(python) 线性结构:无序列表 Unordered List

程序员文章站 2022-09-13 22:30:01
参考自 MOOC数据结构与算法Python版目录什么是列表List抽象数据类型ListList的基本操作Python实现链表:节点Node什么是列表List一种数据项按照相对位置存放的数据集,特别的,被称为“无序表unordered list”, 其中数据项只按照存放位置来索引,如第1个、第2个……、最后一个等。抽象数据类型ListList的基本操作函数含义List()创建一个空列表add(item)添加一个数据项到列表中,假设item原先不存在于列表中app...

参考自 MOOC数据结构与算法Python版

一、什么是列表List

一种数据项按照相对位置存放的数据集,特别的,被称为“无序表unordered list”, 其中数据项只按照存放位置来索引,如第1个、第2个……、最后一个等。

二、抽象数据类型List

2.1 List的基本操作

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

2.2 Python实现链表:节点Node

  • 为了实现无序表数据结构, 可以采用链接表的方案。
  • 虽然列表数据结构要求保持数据项的前后相对位置, 但这种前后位置的保持, 并不要求数据项依次存放在连续的存储空间(在数据项之间建立链接指向, 就可以保持其前后相对位置)
  • 链表实现的最基本的元素是Node
  • 每个节点至少要包含2个信息: 数据项本身,以 及指向下一个节点的引用信息。注意:next为None的意义是没有下一个节点了

链表实现:

  • 可以采用链接节点的方式构建数据集来实现无序表
  • add: 最后被加入的数据项是头节点
  • size:从链条头head开始遍历到表尾同时用变量累加经过的节点个数
  • search:从链表头head开始遍历到表尾, 同时判断当前节点的数据项是否目标
  • remove(item):首先要找到item, 这个过程跟search一样, 但在删除节点时, 需要特别的技巧:current指向的是当前匹配数据项的节点,而删除需要把前一个节点的next指向current的下一个节点,所以我们在search current的同时,还要维护前一个(previous)节点的引用。找到item之后, current指向item节点,previous指向前一个节点, 开始执行删除,需要区分两种情况:
    1. current是首个节点
    2. 位于链条中间的节点

代码如下:

class Node:
   def __init__(self,initdata):
       self.data = initdata
       self.next = None
       self.head = 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
   def add(self, item):
       temp = Node(item)
       temp.setNext(self.head)
       self.head = temp
   def size(self):
       current = self.head
       count = 0
       while current!=None:
           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
           else:
               previous = current
               current = current.getNext()
       if previous == None:   #头节点
           self.head = current.getNext()
       else: #中间的某个节点
           previous.setNext(current.getNext)

本文地址:https://blog.csdn.net/wd9ljs18/article/details/107093947