Python 模拟单链表


# 链表链表, 链组成表, 结点就是链, 表就是链的集合, 所以叫链表
# 承上所述, 链表含有两个对象, 一个是链, 一个是表(不是一般的表)
# 链又叫作结点, 结点有两个属性, 一个是值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')

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值