算法基础(三):链表知识点及题型讲解
- 1 链表定义
- 2 Python链表常用操作
- 2.1 创建链表
- 2.2 添加元素
- 2.3 访问元素
- 2.4 搜索元素
- 2.5 更新元素
- 2.6 删除元素
- 2.7 获取链表长度
- 3 力扣题目训练
一些算法基础知识点和leetcode题解,语言是python。来源于这里。
1 链表定义
链表分为单端链表(从前一个元素指向后一个元素)和双端链表(每一个元素不仅有next指针还有前指针,指向前一个元素。
链表的操作 | 时间复杂度 |
---|---|
访问 Access | O(N) |
搜索 Search | O(N) |
插入 Insert | O(1) |
删除 Delete | O(1) |
- 在链表中,访问元素需要通过next指针从头到尾遍历
- 搜索也一样,要一个一个找
- 插入就很快:
这里指的是这个插入方式的时间复杂度只有O(1)
,没有计算寻找到2的位置的时间复杂度 - 删除也一样,如上图,如果删除4,那就把4前后的指针删掉,然后再连接2和3
总结:链表适用于“写”的操作,而不适用于“读”。写多读少。
链表的结构是值和指针:val
和next
2 Python链表常用操作
2.1 创建链表
from collections import deque
linkedlist = deque() # deque()其实是队列里的操作,这里用来链表
print(linkedlist)
# deque([])
deque()
是双端队列,本质上是列表,所以操作方法和列表一样。
其实也可以创建一个链表类。
2.2 添加元素
O(1):
from collections import deque
linkedlist = deque()
linkedlist.append(1)
linkedlist.append(2)
linkedlist.append(3)
print(linkedlist)
# deque([1, 2, 3])
O(N):寻找到对应位置+插入的步骤,时间复杂度是O(1)
linkedlist.insert(2, 99)
# deque([1, 2, 99, 3])
2.3 访问元素
O(N):这个得从头到尾遍历
print(linkedlist[2]) # 99
2.4 搜索元素
O(N):还是从头到尾检查
index = linkedlist.index(99)
print(index) # 2
2.5 更新元素
O(N):首先需要寻找到2的位置
linkedlist[2] = 88
print(linkedlist) # deque([1, 2, 88, 3])
2.6 删除元素
O(N):要先寻找到这个数
# 删除元素
linkedlist.remove(88)
print(linkedlist) # deque([1, 2, 3])
# 删除索引
del linkedlist[2]
print(linkedlist) # deque([1, 2, 3])
2.7 获取链表长度
O(1):
print(len(linkedlist)) # 4
3 力扣题目训练
力扣203题:移除链表元素