数据结构与算法(三):链表

数据结构与算法(三):链表

最近开始学习王争老师的《数据结构与算法之美》,通过总结再加上自己的思考的形式记录这门课程,文章主要作为学习历程的记录。

与数组需要一块连续的内存空间来存储不同,链表通过“指针”将一组零散的内存块串联起来。常见的链表结构有:单链表,双向链表以及循环链表。

一、单链表

链表通过指针将一组零散的内存块串联在一起。其中,我们把内存块称为链表的结点。为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上下一个结点的地址,如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W1CaSIpF-1571452806547)(E:\PythonCode\数据结构(python)\images\链表.png)]

第一个结点叫做头结点(head),最后一个结点叫做尾结点(tail)。其中,头结点用来记录链表的基地址。有了头结点,即可遍历整条链表,而尾结点特殊的地方是指针不是指向下一个结点,而是NULL,表示是链表的最后一个结点。

对于链表的插入和删除,有:

数据结构与算法(三):链表_第1张图片

针对链表的插入和删除操作,我们只需要考虑相邻结点的指针改变,所以对应的时间复杂度是O(1),但采用链表进行查找,即访问k个元素时,则没有那么高效,需要O(n)的时间复杂度。

带头结点的单链表的插入操作
def insert(self,i,x):
    #插入x作为第i个元素
    p = self.head
    j = -1
    while p is None and ji-1 or p is None:
        raise Exception("插入位置不合法")
    s = Node(x,p.next)
    p.next = s
不带头结点的单链表的插入操作
def insert(self,i,x):
    #插入x作为第i个元素
    p = self.head
    j = -1
    while p is None and ji-1 or p is None:
        raise Exception("插入位置不合法")
    s = Node(data=x)
    if i==0:
        s.next = self.head
    else:
        s.next = p.next
        p.next = s
位序查找
def get(self,i):
    #读取并返回线性表中的第i个数据元素
    p = self.head.next
    j = 0
    #从首结点开始向后查找,直到p指向第i个结点或者p为None
    while ji or p is None:
        raise Exception("第"+i+"个数据元素不存在")
    return p.data
删除
def remove(self,i):
    #删除第i个元素
    p = self.head
    j = -1
    #寻找第i个结点的前驱结点
    while p is not None and ji-1 or p.next is None:
        raise Exception("删除位置不合法")
    p.next = p.next.next

二、循环链表

​ 循环链表是一种特殊的单链表,但其尾结点指向链表的头结点。如下图:

数据结构与算法(三):链表_第2张图片

当要处理的数据具有环型结构特点时,适合采用循环链表。

三、双向链表

​ 双向链表支持两个方向,每个结点不止有一个后继指针next指向后面的结点,还有一个前驱指针prev指向前面的结点。

数据结构与算法(三):链表_第3张图片

双向链表需要额外的空间来存储后继结点和前驱结点的地址。如果存储同样多的数据,双向链表要比单链表占用更多的内存空间。双向链表可以支持O(1)时间复杂度的情况下找到前驱结点,正是这样的特点,也使双向链表在某些情况下的插入和删除操作来的简单。

以删除操作为例,删除操作分为两种情况:①删除结点中“值等于某个给定值”的结点②删除给定指针指向的结点

对于①,无论是单链表还是双向链表,都需要遍历找到给定值,时间复杂度为O(n),删除的时间复杂度为O(1),故时间复杂度为O(n).

对于②,已经知道了要删除的结点,但删除某个结点需要知道其前驱结点,而单链表不支持直接获取前驱结点,仍需遍历,故需O(n)的时间复杂度。但对于双向链表,结点已经保存了前驱的结点的指针,不需像单链表一样遍历,因此时间复杂度为O(1).

参考资料:1.王争《数据结构与算法之美》

​ 2.吕云翔,郭颖美,孟爻《数据结构》

你可能感兴趣的:(数据结构与算法)