【Python数据结构与算法】链表

2018-7-18 北京阴 大毛夏令营过啦!

线性结构:内存连续,可以通过下标访问——如list
链式结构:内存不连续,通过链接指针的方式指向下一个,不可以通过下标访问;但是追加元素方便;查找时需要遍历

单链表

通过指针的方式将节点一个个串起来
root(根节点,是一个入口,可以进行遍历) — head — node — node — tail

每一个node包含:value和next(指向下一个元素) —— node类

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

还有单链表类:data和method

class LinkedList(object):
    """ 链接表 ADT
    [root] -> [node0] -> [node1] -> [node2]
    """

单链表的方法有:

__len__
append
appendleft
iter_node
__iter__
remove
find
popleft
clear

实现这些方法的时候,应当从指针考虑,即是用好next

链表操作 均时间复杂度
linked_list.append(value) O(1)
linked_list.appendleft(value) O(1)
linked_list.find(value) O(n)
linked_list.remove(value) O(n)

append和appendleft只需要在最右或者最左插入一个节点即可
而find和remove则需要遍历整个链表(remove也需先遍历)
而且单链表只能单向遍历(?)

循环双链表

双链表即是双端链表

相比单链表来说,每个节点既保存了指向下一个节点的指针,同时还保存了上一个节点的指针。

class Node(object):
    def __init__(self, value=None, prev=None, next=None):
        self.value, self.prev, self.next = value, prev, next

和单链表相比,只多了一个prev

循环双链表的方法有:

__len__
append
appendleft
iter_node
iter_node_reverse
remove

注意当appende、remove等操作时,对node的指针操作时,如指向tailnode、root,并不影响之前tailnode、root之间的链接,只有对tailnode、headnode和root等对象的指针进行重指向的操作时,才会使链接断裂。
理解这一点以后,就很容易对链表进行操作了。

猜你喜欢

转载自blog.csdn.net/alvin93/article/details/81116624