鱼C论坛

 找回密码
 立即注册
查看: 3045|回复: 4

[技术交流] 算法:SingleLink单链表(1)

[复制链接]
发表于 2023-2-10 17:06:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

新建一个空白.py文件,命名为singlelink.py
上次学习了节点,并保存为了node.py
将singlelink和node保存在同一目录
今天的程序需要使用node.py的Node类,所以
  1. from node import Node
复制代码

然后,说明一下SingleLink实例的属性和方法
- 属性   head 头节点,说白了就是列表的abdcys7[0](名字乱起的)
- 属性   length 长度
- 方法   add(data) 添加元素data到开头
       网上有些不讲代码的思路,很难懂,所以我讲解一下
  1.     def add(self, data):
  2.         # 在node.py的示例中,节点可以说是一环套一环,node1.next.next是node1往后两个元素
  3.         # 所以我们也要“包围”self.head,代替第一个元素,用一个新节点替换掉self.head
  4.         new = Node(data, next=self.head)
  5.         self.head = new  # 原来的self.head并没有被“抛弃”,它成为了new.next
复制代码

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

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

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

  9.      def __repr__(self):
  10.           msg = ''
  11.           values = list(self)
  12.           return str(values)

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

  20.      def get(self, index):
  21.          return list(self)[index]

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

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

  28.      def append(self, data):
  29.         if self.length:
  30.             self.get(self.length - 1).next = Node(data)
  31.         else:
  32.             self.head = Node(data)
  33.         self.length += 1

  34. if __name__ == '__main__':
  35.     sl = SingleLink()
  36.     sl.append(9)
  37.     print(list(sl))

复制代码

注:空格可能没敲对,用ipad的
还有,重复的length和__len__、get和getitem是为了给用户(你们)更多的选择,想怎么样怎么样
接受建议改过之后都2400多字节了,所以这只是(1)而已
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-10 17:18:36 | 显示全部楼层
append 方法里的 self 和 get 是不是没定义?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-10 17:20:11 | 显示全部楼层
dolly_yos2 发表于 2023-2-10 17:18
append 方法里的 self 和 get 是不是没定义?


self确实是忘了多谢指出
都说了这是(1),还有(2),也许还有(3)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

了解,看来是我心急了
不过也许确保每一篇帖子结束的地方程序都是可运行的,或者明确的指出来将会在之后修改或补充的刻意留出的内容会更好一些?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

可以
那我改一下稍等
get我也写一下哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-24 22:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表