# 链表链表, 链组成表, 结点就是链, 表就是链的集合, 所以叫链表
# 承上所述, 链表含有两个对象, 一个是链, 一个是表(不是一般的表)
# 链又叫作结点, 结点有两个属性, 一个是值value (或数据data), 另一个是后继next
# 表又叫作链表, (单)链表有两个属性, 一个是表头head, 一个是表长length
# (链表的)结点类, 一个结点有两个属性(不严谨地可以说成两个元素), 分别是值value 和 后继next
class ListNode: # 以下注释中简称为 Node
def __init__(self, val=0, next=None):
self.val = val
self.next = next # 后续操作中, next 也是结点变量, 有一点套娃的味道
# 链表类
class LinkedList:
# 逻辑上, LinkedList 含有 length(self) 个元素
# 物理上, LinkeList 只有两个属性, 或(强行地)理解成只有两个元素, 分别是 表头head 和 表长length
def __init__(self): # 生成空表,
self.head = None # 表头暂时为空,
# ↑ head 初始为None, 但后续是 Node 类型
self.length = 0 # 初始长度为0
# ↓ 把顺序表 data 转化成 LinkedList,
def create(self, data):
# ↓ 表头指向 ListNode(0)
self.head = ListNode(0)
# ↑ head 是结点变量(有两个属性)
# ↑ 构造器含默认参数, 且已赋值, 可以只传一个参数, 或不传参数
curent_node = self.head # current 当前结点 (或当前指针),
# ↑ 把 head(结点)赋值给(复制给) curent_node, 以达到(或模拟)指针效果
# ↑ 先让 curent_node 复制 head, 后续 curent_node 会挨个复制每一个结点
for i in range(len(data)):
# ↓ 这一句先别看, 先看下一句
node = ListNode(data[i])
# ↑ 但是这个结点的 next 属性为空, 因为data[i] 是一维的, Node 是二维的,
# ↑ 所以 结点.val = data[i], 结点.next 为默认值 None
# ↑ 但是后续 结点的 next 属性会复制下一个结点, 后续 next 的类型为 Node
# ↑ 把 data[i] 转化成其对应的结点, 此过程类似升维, data[i] 只有一个属性, 结点有两属性
# ↓ 把 curent_node.next 复制为 node, 后续 curent_node.next 会挨个复制为下一个结点, 相当于动态指针, 或者理解为 (数据库的)cursor
curent_node.next = node # curent_node.next = ListNode(data[i])
# ↑ curent_node 有两个属性(val 和 next)
# ↑ curent_node 的类型是 Node, curent_node.next 的类型也是 Node
# ↑ 想不到吧! 懵逼了吧!😂
# ↑ 领导(是一个人)有一个(属性是)下属, 这个下属(也是人)有一个(属性是)下属, 下属有一个下属......
curent_node = curent_node.next
# ↑ curent_node.next 是 当前 curent_node 所复制的那个结点的next, 也就是当前所复制的那个结点的下一个结点
# ↑ 相当于数据库的 FETCH NEXT 语句
# ↓ 打印
def print_list(self, withindex=None):
current_node = self.head
current_node = current_node.next
while current_node is not None:
if withindex == 'withindex':
print(current_node.val, current_node)
else:
print(current_node.val, end=' ')
current_node = current_node.next
print()
# ↓ 头插 自己写吧
def insert_head(self):pass
# ↓ 尾插 自己写吧
def insert_end(self):pass
# ↓ 任意位置插 自己写吧
def insert_mid(self):pass
# ↓ 删除 自己写吧
def delete(self, data):pass
linkedlist_1 = LinkedList()
linkedlist_1.create([1,2,3])
linkedlist_1.print_list()
linkedlist_1.print_list('withindex')
Python 模拟单链表
于 2023-04-11 23:07:07 首次发布
文章详细介绍了链表的概念,包括链表的结点结构和链表类。结点包含值value和后继next属性,链表类有表头head和表长length。通过示例展示了如何创建一个链表,并提供了打印链表的方法。此外,还列出了头插、尾插、中间插入和删除等操作的接口定义。
摘要由CSDN通过智能技术生成