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

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

目录

      • 一、什么是有序表OrderedList
      • 二、抽象数据类型:有序表OrderedList
        • 2.1 OrderedList的基本操作
        • 2.2 Python实现

一、什么是有序表OrderedList

  • 有序表是一种数据项依照其某可比性质(如整数大小、 字母表先后) 来决定在列表中的位置
  • 越“小”的数据项越靠近列表的头, 越靠“前”

数据结构与算法(python) 线性结构:有序列表Ordered List_第1张图片

二、抽象数据类型:有序表OrderedList

2.1 OrderedList的基本操作
函数 含义
OrderedList() 创建一个空的有序表
add(item) 在表中添加一个数据项,并保持整体顺序,item原不存在
remove(item) 从有序表中移除一个数据项,item应存在,有序表被修改
search(item) 在有序表中查找item,返回布尔类型值
isEmpty() 返回OrderedList是否为空
size() 返回表中包含数据项的个数
index(item) 返回数据项在表中的位置,item应存在
pop() 从有序表末尾移除数据项,假设原表至少有1个数据项
pop(pos) 移除位置为pos的数据项,假设原表存在位置pos
2.2 Python实现
  • 在实现有序表的时候, 需要记住的是, 数据项的相对位置, 取决于它们之间的“大小”比较
  • 以整数数据项为例, (17, 26, 31, 54, 77, 93)的链表形式如图

在这里插入图片描述
有序表OrderedList实现

  • 同样采用链表方法实现
  • Node定义相同
  • OrderedList也设置一个head来保存链表表头的引用
  • 对于isEmpty/size/remove这些方法,与 节 点 的 次 序 无 关 , 所 以 其 实 现 跟UnorderedList 是一样的。
  • search/add方法则需要有修改
  • 对于有序表来说, 可以利用链表节点有序排列的特性, 来为search节省不存在数据项的查找时间。一旦当前节点的数据项大于所要查找的数据项,则说明链表后面已经不可能再有要查找的数据项,可以直接返回False。
  • 相比无序表, 改变最大的方法是add, 因为add方法必须保证加入的数据项添加在合适的位置, 以维护整个链表的有序性

代码如下:

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
    def add(self, item):
        current = self.head
        previous = None
        stop = False
        ###发现插入位置#####
        while current != None and not stop:
            if current.getData()>item:
                stop = True
            else:
                previous = current
                current = current.getNext()
        temp = Node(item)
        ###插入在表头###
        if previous == None:
            temp. setNext(self.head)
            self.head = temp
        ###插入在表中###
        else:
            temp.setNext(current)
            previous.setNext(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 and not stop:
            if current.getData() == item:
                found = True
            else:
                if current.getData()>item:
                    stop = True
                else:
                    current = current.getNext()                  
        return found

链表实现的算法分析
对于一个包含节点数为n的链表

  • isEmpty是O(1),因为仅需要检查head是否为None
  • size是O(n),因为除了遍历到表尾,没有其它办法得知节点的数量
  • search/remove以及有序表的add方法,则是O(n),因为涉及到链表的遍历,按照概率其平均操作的次数是n/2
  • 无序表的add方法是O(1),因为仅需要插入到表头

你可能感兴趣的:(Python数据结构,数据结构,python,链表)