歌者文明清理员 发表于 2023-2-10 17:06:44

算法:SingleLink单链表(1)

本帖最后由 歌者文明清理员 于 2023-2-10 17:37 编辑

新建一个空白.py文件,命名为singlelink.py
上次学习了节点,并保存为了node.py
将singlelink和node保存在同一目录下
今天的程序需要使用node.py的Node类,所以
from node import Node
然后,说明一下SingleLink实例的属性和方法
- 属性   head 头节点,说白了就是列表的abdcys7(名字乱起的)
- 属性   length 长度
- 方法   add(data) 添加元素data到开头
       网上有些不讲代码的思路,很难懂,所以我讲解一下
    def add(self, data):
      # 在node.py的示例中,节点可以说是一环套一环,node1.next.next是node1往后两个元素
      # 所以我们也要“包围”self.head,代替第一个元素,用一个新节点替换掉self.head
      new = Node(data, next=self.head)
      self.head = new# 原来的self.head并没有被“抛弃”,它成为了new.next

- 方法   append(data) 在末尾追加元素
    def append(self, data):
      if self.length:# 如果是整数作为条件,0为false,其他True
            # length - 1是最后一个元素的索引
            # 包围新节点
            self.get(self.length - 1).next = Node(data)
      else:
            self.head = Node(data)
            # 完全可以写成Node(data, next=self.head),可length为0的时候head是None,所以next=None,也是默认值,所以没有这个必要

- 方法    get(index)   获取索引index
打了这么多,先看看目前程序变啥样了吧
from node import Node
# -*- coding: utf-8 -*-
class SingleLink:
   def __init__(self):
      self.head = None
      self.length = 0

   def __len__(self):# len(instance)的时候调用的函数
      return self.length

   def __repr__(self):
          msg = ''
          values = list(self)
          return str(values)

   def __iter__(self):# 当试图将链表改变为可迭代对象
          if self.length:
            cur = self.head
            yield cur.data
            while cur.next != None:
               cur = cur.next
               yield cur.data

   def get(self, index):
         return list(self)

   def __getitem__(self, key):
         return self.get(key)

   def add(self, data):
      new = Node(data, next=self.head)
      self.head = new
      self.length += 1

   def append(self, data):
      if self.length:
            self.get(self.length - 1).next = Node(data)
      else:
            self.head = Node(data)
      self.length += 1

if __name__ == '__main__':
    sl = SingleLink()
    sl.append(9)
    print(list(sl))


注:空格可能没敲对,用ipad的
还有,重复的length和__len__、get和getitem是为了给用户(你们)更多的选择,想怎么样怎么样
接受建议改过之后都2400多字节了,所以这只是(1)而已

dolly_yos2 发表于 2023-2-10 17:18:36

append 方法里的 self 和 get 是不是没定义?

歌者文明清理员 发表于 2023-2-10 17:20:11

dolly_yos2 发表于 2023-2-10 17:18
append 方法里的 self 和 get 是不是没定义?

self确实是忘了多谢指出
都说了这是(1),还有(2),也许还有(3)

dolly_yos2 发表于 2023-2-10 17:23:04

歌者文明清理员 发表于 2023-2-10 17:20
self确实是忘了多谢指出
都说了这是(1),还有(2),也许还有(3)

了解,看来是我心急了
不过也许确保每一篇帖子结束的地方程序都是可运行的,或者明确的指出来将会在之后修改或补充的刻意留出的内容会更好一些?

歌者文明清理员 发表于 2023-2-10 17:24:26

dolly_yos2 发表于 2023-2-10 17:23
了解,看来是我心急了
不过也许确保每一篇帖子结束的地方程序都是可运行的,或者明确的指出来将会在之后 ...

可以
那我改一下稍等
get我也写一下哈
页: [1]
查看完整版本: 算法:SingleLink单链表(1)