马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 歌者文明清理员 于 2023-2-10 17:37 编辑
新建一个空白.py文件,命名为singlelink.py
上次学习了节点,并保存为了node.py
将singlelink和node保存在同一目录下
今天的程序需要使用node.py的Node类,所以然后,说明一下SingleLink实例的属性和方法
- 属性 head 头节点,说白了就是列表的abdcys7[0](名字乱起的)
- 属性 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)[index]
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)而已 |