IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Python 单链表为例一步步从简到烦深入“类”,新手不看绝对后悔 -> 正文阅读

[数据结构与算法]Python 单链表为例一步步从简到烦深入“类”,新手不看绝对后悔

前提知识点?

本文以准备以“链表类”为例,一步步深入学习“类”。关于链表的概念定义略,详见上一篇文章的介绍: 链接地址点这里快速到达

一个最基础的节点类

就一个初始化方法 __init__(),定义一个节点类

三个属性: 其中,val和value是等价的,表示节点存储的数据; next 表示指针,指向下一节点。

class Node():

    def __init__(self, value=None, Next=None):
        self.val = self.value = value
        self.next = Next

'''
# 测试:
>>> node = Node(1)
>>> node.next = Node(2)
>>> node.val
1
>>> node.value
1
>>> node.next.val
2
>>>
>>> node = Node(1, Node(2))
>>> node.val
1
>>> node.next.value
2
>>> 

'''

进一步尝试其他操作:

>>> node = Node()
>>> help(Node)
Help on class Node in module __main__:

class Node(builtins.object)
 |  Node(value=None, Next=None)
 |  
 |  Methods defined here:
 |  
 |  __init__(self, value=None, Next=None)
 |      Initialize self.  See help(type(self)) for accurate signature.
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  __dict__
 |      dictionary for instance variables (if defined)
 |  
 |  __weakref__
 |      list of weak references to the object (if defined)

>>> node
<__main__.Node object at 0x00375B68>
>>> node.__doc__
>>> node.__dict__
{'val': None, 'value': None, 'next': None}
>>> node = Node(1,Node(2))
>>> node.__dict__
{'val': 1, 'value': 1, 'next': <__main__.Node object at 0x00375BB0>}

类的方法定义、数据描述符定义等就一两项,说明文档也为空。但就这么简单的类,已经可以用它解决实际问题了,来举个简单的例子:

将两个有序链表(升序)合并为一个新的有序链表并返回。
List1: 1->2>4->8? List2: 1->3->3->5->5

把可以反复利用的代码,新写两个函数拓展到这个类里:除了主要功能合并方法外,另写一个便于检查是否正确的遍历方法
?

拓展一: 新增方法

>>> class Node():

	def __init__(self, value=None, Next=None):
		self.val = self.value = value
		self.next = Next

	def merge(self, node):
		ret = cur = Node()
		while self and node:
			if self.val < node.val:
				cur.next = self
				self = self.next
			else:
				cur.next = node
				node = node.next
			cur = cur.next
		cur.next = self or node
		return ret.next

	def travel(self):
		ret,cur = [],self
		while cur is not None:
			ret.append(cur.val)
			cur = cur.next
		return ret

测试结果:

>>> NodeList1 = Node(1,Node(2,Node(4,Node(8))))
>>> NodeList2 = Node(1,Node(3,Node(3,Node(5,Node(5)))))
>>> NodeList1.travel()
[1, 2, 4, 8]
>>> NodeList2.travel()
[1, 3, 3, 5, 5]
>>> NodeList = NodeList1.merge(NodeList2)
>>> NodeList.travel()
[1, 1, 2, 3, 3, 4, 5, 5, 8]
>>>?

经测试,完全正确!
?

?拓展二:魔术方法

对比内置list列表类,看以下代码:

>>> l = list([1,2,3])
>>> len(l)
3
>>> str(l)
'[1, 2, 3]'
>>> l
[1, 2, 3]
>>> type(l)
<class 'list'>
>>> type(l) is list
True
>>> 
>>> n = Node(1,Node(2,Node(3)))
>>> len(n)
Traceback (most recent call last):
  File "<pyshell#82>", line 1, in <module>
    len(n)
TypeError: object of type 'Node' has no len()
>>> str(n)
'<__main__.Node object at 0x0000000002CD28B0>'
>>> n
'<__main__.Node object at 0x0000000002CD28B0>'
>>> type(n)
<class '__main__.Node'>
>>> type(n) is Node
True
>>> 

请出__len__, __str__, __repr__等等这些标准的类内置方法(命名两头均是双下划线),来模拟内置类的功能。同时去掉merge保留travel改名为values,travel结果返回文本。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 12:59:14  更:2021-07-30 12:59:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 17:29:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码