数据结构与算法_有序列表与无序列表的Python实现

数据结构和算法是计算机技术的基本功之一,北京大学的课程深入浅出,使用Python作为载体简化了编程难度。最近浏览了27-31,主要内容是使用链表数据结构实现有序列表、无序列表。

无序列表实现

列表本身按照相对位置存放数据,List就是无序表
add(),append(),insert(0,item),index(item)返回数据项在表中的位置,pop(pos)移除指定位置数据项
采用链表实现无序表,因为数据项前后位置的保存不要求数据项依次存放在连续的存储空间
链接指向 和 前后相对位置
数据节点Node是链表实现的基本结构,包含数据和下一节点的位置信息

class Node:
    def __init__(self, initdata):
        self.data= initdata
        self.next=None#next 保存下一个节点

    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,保存对第一个节点的引用。空表的head是None。
无序表本身并不包含数据项。数据项保存在节点中。
添加新的数据项最快的地方是链表的首位

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

    def add(self,item):
        temp=Node(item)#新节点存入数据
        temp.setNext(self.head)#新节点链接表头,增加链表
        self.head=temp#更新表头节点
    
    def size(self):
        count=0
        current=self.head
        while current!=0:
            count=count+1
            current=current.getNext()
        return count

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

    #remove实现,需要保留前一个节点的next
    def remove(self,item):
        current=self.head
        previous=None
        if item==current.getData():
            self.head=current.getNext()
        else:
            while current!=None:
                previous=current
                current=current.getNext()
                if current.getData()==item:
                    previous.setNext(current.getNext())
                else:
                    previous=previous.getNext()
                    current=current.getNext()     
        return item

    def pop(pos):
        current=self.head
        out=None
        i=0
        if pos==0:
            out=current.getData()
            self.head=current.getNext()
        if pos>0:
            while i<pos:
                i+=1
                previous=current
                current=current.getNext()
        previous.setNext(current.getNext())
        out=current.getData()
        return out

    #双链表,每个节点两个指针,分别表示上下

有序列表实现

有序列表抽象数据类型及实现——OrderedList
数据依照其某种科比性质来决定在列表中的位置

"""
add(item)保持整体顺序
remove(item)
search(item)
index(item)
size()
pop()
pop(pos)
"""

数据项的相对位置取决于大小比较,Python中只要定义了gt方法的都适用
同样采用链表实现,公用Node

class OrderedList:
    def __init__(self):
        self.head=None
    #isEmpty(),size(),remove()跟节点次序无关

    def size(self):
        count=0
        current=self.head
        while current!=0:
            count=count+1
            current=current.getNext()
        return count

    #Search/add则需要修改,search可以提前结束
    def search(self,item):
        current=self.head
        found=False
        stop=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()
    
    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:
            previous.setNext(temp)
            temp.setNext(current)

链表实现复杂度取决于是否需要遍历,isEmpty是1,size是n,search/remove/add有序是n,add无序是1
Python的List是用顺序存储来实现的,并进行了优化

线性结构小结

线性结构小结:
栈Stack维持了数据项后进先出的次序
队列Queue维持了数据项先进先出的次序
双端队列Deque同时具备栈和队列的功能
链表实现的列表List维持相对位置的数据集,节点保存相对位置
有序列表OrderedList
无序列表UnorderedList

涉及到其他知识点:表达式风格,现实问题建模的概念等。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容