python数据结构与算法基础 第六课
tags:
- python
- 路飞学院
categories:
- python
- 数据结构
- 链表
文章目录
第一节 链表定义
1. 链表介绍
- 链表和列表一样也是线性数据结构(一个节点有前面有后面),但是它不是顺序存储,它是链式存储。
- 链表是由一系列节点组成的元素集合。每个节点包含两部分,数据域item和指向下一个
节点的指针next。通过节点之间的相互连接,最终串联成一个链表。
class Node:
def __init__(self, item):
self.item = item
self.next = None
a = Node(1)
b = Node(2)
c = Node(3)
a.next = b
b.next = c
print(a.next.item)
第二节 链表的创建和遍历
1. 头插法
def create_linklist_head(li):
head = Node(li[0])
for element in li[1:]:
node = Node(element)
node.next = head
head = node
return head
def print_linklist(lk):
while lk:
print(lk.item, end=',')
lk = lk.next
lk = create_linklist_head([1, 2, 3])
print_linklist(lk)
2. 尾插法
def create_linklist_tail(li):
# 尾插法 需要维护头和尾的元素
head = Node(li[0])
tail = head
for element in li[1:]:
node = Node(element)
tail.next = node
tail = node
return head
def print_linklist(lk):
while lk:
print(lk.item, end=',')
lk = lk.next
lk = create_linklist_tail([1, 2, 3])
print_linklist(lk)
第三节 链表的插入和删除
1. 链表的插入
- 首先回忆下列表的插入的时间复杂度为:O(n). 它需要往后面挪动元素
- p是需要插入的节点
p.next = curNode.next
curNode.next = p
2. 链表的删除
p = curNode.next
curNode.next = curNode.next.next
del p
第四节 双链表
1. 双链表介绍
- 双链表的每个节点有两个指针:一个指向后一个节点,另一个指向前一一个节点。
- 如何建立双链表?
class Node:
def_ init__ (self, item=None):
self.item = item
self.next = None
self.prior = None
2. 双链表插入
p.next = curNode.next
curNode.next.prior = p
p.prior = curNode
curNode.next = p
3. 双链表删除
p = curNode.next
curNode.next = p.next
p.next.prior = curNode
del p
第五节 链表总结
- 顺序表(列表/数组)与链表
- 按元素值查找:都是O(n)
- 按下标查找: 列表更快O(1), 链表O(n)
- 在某元素后插入 (链表的插入和删除比列表更快)
- 删除某元素
结论:
- 链表在插入和删除的操作,上明显快于顺序表
- 链表的内存可以更灵活的分配
- 利用链表可以实现栈和队列
- 链表这种链式存储的数据结构对树和图的结构有很大的启发性