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等对象的指针进行重指向的操作时,才会使链接断裂。
理解这一点以后,就很容易对链表进行操作了。