# -*- coding: utf-8 -*-
class Node(object):
def __init__(self, value=None, next=None): # 这里我们 root 节点默认都是 None,所以都给了默认值
self.value = value
self.next = next
def __str__(self):
"""方便你打出来调试,复杂的代码可能需要断点调试"""
return '<Node: value: {}, next={}>'.format(self.value, self.next)
__repr__ = __str__
class LinkedList(object):
""" 链接表 ADT
[root] -> [node0] -> [node1] -> [node2]
"""
def __init__(self, maxsize=None):
"""
:param maxsize: int or None, 如果是 None,无限扩充
"""
self.maxsize = maxsize
self.root = Node() # 默认 root 节点指向 None
self.tailnode = None
self.length = 0
def __len__(self):
return self.length
def append(self, value): # O(1)
if self.maxsize is not None and len(self) >= self.maxsize:
raise Exception('LinkedList is Full')
node = Node(value) # 构造节点
tailnode = self.tailnode
if tailnode is None: # 还没有 append 过,length = 0, 追加到 root 后
self.root.next = node
else: # 否则追加到最后一个节点的后边,并更新最后一个节点是 append 的节点
tailnode.next = node
self.tailnode = node
self.length += 1
def appendleft(self, value):
if self.maxsize is not None and len(self) >= self.maxsize:
raise Exception('LinkedList is Full')
node = Node(value)
if self.tailnode is None: # 如果原链表为空,插入第一个元素需要设置 tailnode
self.tailnode = node
headnode = self.root.next
self.root.next = node
node.next = headnode
self.length += 1
def __iter__(self):
for node in self.iter_node():
yield node.value
def iter_node(self):
"""遍历 从 head 节点到 tail 节点"""
curnode = self.root.next
while curnode is not self.tailnode: # 从第一个节点开始遍历
yield curnode
curnode = curnode.next # 移动到下一个节点
if curnode is not None:
yield curnode
def remove(self, value): # O(n)
""" 删除包含值的一个节点,将其前一个节点的 next 指向被查询节点的下一个即可
:param value:
"""
prevnode = self.root #
for curnode in self.iter_node():
if curnode.value == value:
prevnode.next = curnode.next
if curnode is self.tailnode: # NOTE: 注意更新 tailnode
self.tailnode = prevnode
del curnode
self.length -= 1
return 1 # 表明删除成功
else:
prevnode = curnode
return -1 # 表明删除失败
def find(self, value): # O(n)
""" 查找一个节点,返回序号,从 0 开始
:param value:
"""
index = 0
for node in self.iter_node(): # 我们定义了 __iter__,这里就可以用 for 遍历它了
if node.value == value:
return index
index += 1
return -1 # 没找到
def popleft(self): # O(1)
""" 删除第一个链表节点
"""
if self.root.next is None:
raise Exception('pop from empty LinkedList')
headnode = self.root.next
self.root.next = headnode.next
self.length -= 1
value = headnode.value
if self.tailnode is headnode: # 勘误:增加单节点删除 tailnode 处理
self.tailnode = None
del headnode
return value
def clear(self):
for node in self.iter_node():
del node
self.root.next = None
self.length = 0
self.tailnode = None
def reverse(self):
"""反转链表"""
curnode = self.root.next
self.tailnode = curnode # 记得更新 tailnode,多了这个属性处理起来经常忘记
prevnode = None
while curnode:
nextnode = curnode.next
curnode.next = prevnode
if nextnode is None:
self.root.next = curnode
prevnode = curnode
curnode = nextnode
def test_linked_list():
ll = LinkedList()
ll.append(0)
ll.append(1)
ll.append(2)
ll.append(3)
assert len(ll) == 4
assert ll.find(2) == 2
assert ll.find(-1) == -1
assert ll.remove(0) == 1
assert ll.remove(10) == -1
assert ll.remove(2) == 1
assert len(ll) == 2
assert list(ll) == [1, 3]
assert ll.find(0) == -1
ll.appendleft(0)
assert list(ll) == [0, 1, 3]
assert len(ll) == 3
headvalue = ll.popleft()
assert headvalue == 0
assert len(ll) == 2
assert list(ll) == [1, 3]
assert ll.popleft() == 1
assert list(ll) == [3]
ll.popleft()
assert len(ll) == 0
assert ll.tailnode is None
ll.clear()
assert len(ll) == 0
assert list(ll) == []
def test_linked_list_remove():
ll = LinkedList()
ll.append(3)
ll.append(4)
ll.append(5)
ll.append(6)
ll.append(7)
ll.remove(7)
print(list(ll))
def test_linked_list_reverse():
ll = LinkedList()
n = 10
for i in range(n):
ll.append(i)
ll.reverse()
assert list(ll) == list(reversed(range(n)))
def test_linked_list_append():
ll = LinkedList()
ll.appendleft(1)
ll.append(2)
assert list(ll) == [1, 2]
if __name__ == '__main__':
test_linked_list()
test_linked_list_append()
test_linked_list_reverse()
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Python数据结构与算法教程及代码吐血整理! 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。 数据结构(Data Structures):是计算机存储和组织数据的一种方式,可以用来高效地处理数据。 举个例子:二分查找就是一个非常经典的算法,而二分查找经常需要作用在一个有序数组上。这里二分就是一种折半的算法思想, 而数组是我们最常用的一种数据结构,支持根据下标快速访问。很多算法需要特定的数据结构来实现,所以经常把它们放到一块讲。 实际上,在真正的项目开发中,大部分时间都是 从数据库取数据 -> 数据操作和结构化 -> 返回给前端,在数据操作过程中需要合理地抽象, 组织、处理数据,如果选用了错误的数据结构,就会造成代码运行低效。这也是我们需要学习算法和数据结构的原因。 本资源从深层原理入手,包含丰富实例100+,深入浅出展现面试所需知识点及考题和答案,同学们自主选择。
资源推荐
资源详情
资源评论
收起资源包目录
github课程.zip (96个子文件)
github课程
13_高级排序算法
merge_sort.md 4KB
merge_sorted_array.png 109KB
merge_sorted_array_2.png 118KB
tn.png 170KB
quicksort.py 3KB
advanced_sorting.md 368B
test.sh 205B
merge_sort_split.png 55KB
quick_sort.md 6KB
merge_sort.py 1KB
merge_sort_recursion_tree.png 93KB
quicksort_worst.png 66KB
partition.png 98KB
quick_sort.png 92KB
merge_sort_merge.png 53KB
18_图与图的遍历
graph.md 5KB
graph.py 2KB
graph_rep.png 87KB
graph_road.png 73KB
bfs.png 48KB
10_递归
hanoi.gif 47KB
recursion.py 1KB
hanoi_tower.png 20KB
recursion.md 9KB
fact.png 13KB
hanoi_four_disks.png 19KB
print_rec.png 114KB
06_算法分析
big_o.md 6KB
function_growth.png 143KB
15_堆与堆排序
heap.png 54KB
lfu.py 2KB
siftup.png 105KB
heap_and_heapsort.py 4KB
topk.py 1KB
heap_array.png 66KB
heap_and_heapsort.md 8KB
siftdown.png 114KB
16_优先级队列
priority_queue.md 2KB
priority_queue.py 4KB
01_抽象数据类型和面向对象编程
ADT_OOP.md 2KB
bag_adt.py 695B
00_课程简介之笨方法学算法
why_and_how_to_learn.md 2KB
09_集合
set.png 80KB
set_adt.py 5KB
set.md 3KB
03_链表
double_link_list.py 3KB
linked_list.py 6KB
linked_list.md 6KB
lru_cache.py 5KB
05_栈
stack.md 4KB
stack.py 5KB
17_二叉查找树
find_successor.png 114KB
bst.py 5KB
bst_remove_leaf.png 68KB
remove_interior_replace.png 62KB
bst.png 35KB
predecessor_successor.png 42KB
bst_search.png 53KB
bst_remove_node_with_one_child.png 73KB
bst_insert.png 65KB
binary_search_tree.md 10KB
bst_worstcase.png 41KB
.DS_Store 6KB
19_python内置常用算法和数据结构
builtins.md 2KB
02_数组和列表
list.png 242KB
array_and_list.md 3KB
array_and_list.py 913B
20_面试指南
interview.md 4KB
.gitignore 225B
07_哈希表
quadratic_hash.png 26KB
insert_hash.png 163KB
insert_hash_chaining.png 222KB
hashtable.py 4KB
quadratic_result.png 21KB
hashtable.md 9KB
12_基本排序算法
basic_sort.py 2KB
basic_sort.md 6KB
14_树与二叉树
binary_tree_level.png 57KB
btree.py 5KB
family_tree.png 70KB
complete_binary_tree.png 54KB
full_binary_tree.png 30KB
tree.md 12KB
tree.png 57KB
preorder.png 60KB
perfect_binary_tree.png 20KB
binary_tree.png 78KB
11_线性查找与二分查找
search.md 5KB
search.py 2KB
04_队列
queue.py 5KB
queue.md 4KB
array_queue.png 107KB
deque.py 88B
array_queue.py 2KB
08_字典
dict_adt.py 5KB
dict.md 3KB
共 96 条
- 1
资源评论
- keavinn2023-04-17零基础征服数据结构算法Python版(2023新课) 网盘地址:https://pan.baidu.com/s/1XhrD8ykkn8SinFs_Tkoz2g 提取码: jjiy
大数据之眸
- 粉丝: 765
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 全球IP视频监控与VSaaS行业分析:产商Avigilon、Bosch、Honeywell
- NEU-DET数据集(包括1800张图片,1800个xml文件,1800个txt文件)
- 【码上开学技术文档】Kotlin 的协程用力瞥一眼
- spyder-开源 Python IDE
- 全球IO链接(IO-Link)行业分析:欧洲是最大市场,占36%市场份额
- nginx的反向代理和负载均衡 配置文件
- Fiddler安装包和FiddlerCertMaker安装Https证书组件
- 【Visual Basic技术文档】Visual Basic 概述
- java基于ssm+jsp 政务大厅管理系统源码 带毕业论文+ppt+sql
- 毕业设计JAVA医药供应链协同管理平台(源代码+论文).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功