Python Linked List
上周日教导一个科班非技术的朋友学习 Python 编程。他的 Python 水平大概就是看了几篇短的 Python 介绍博客、会流程控制和全局函数编写。
具体教导思路是从自己实现一个链表出发,研究学习 Python 数据结构、接口、算法的实现和运用、然后:
0. 学会画图表达对象之间的关联、数据结构的操作、并实现它。
- 慢慢用 Python 的特性去优化链表、学习 Python 特性与最佳实践;
- 刷 Leetcode 链表题目、锻炼思维;
- 熟悉之后、在进行二叉排序树的 0、1、2。
昨天算是实现了一个带遍历、插入、删除的 LinkedList。但是写的很长、大概用到的“新”特性只有 Python 的类。
今天打算让他快速前进,尝试拔苗助长ing:
- 理解成员函数的self、了解函数的默认参数;
- 理解抛出异常的代码写法和运行现象;
- 还有再学习一下类的特殊方法
__len__和__str__; - 理解鸭子类型:
- Python 有个逻辑:不管你是什么动物,会嘎嘎叫的就是鸭子;
- 你想想看 ListLink.head 和 Node.next 是不是一个东西?
- 可不可以起成同一个名字 把它当成嘎嘎叫方法 (next),从而简化我们的代码;
- 如果把 ListLink 当作鸭子类,那么Node也是一个鸭子类;
- 关键:Node 和 ListLink 一样,也有 next 属性;两者的 next 属性的性质一样,要么是 None,要么是一个有 data 有 next 的对象;
- 另一种理解:链表第一个结点之后的部分还是一个完整的链表。
- 理解函数是一等公民 -- 下面代码还没实现、因为已经有
__iter__了没有必要了。
个人感觉4讲早了,但是看他写的又长又臭,忍不住不教。
代码:
class Stack:
class Node:
def __init__(self, data, next = None):
self.data = data
self.next = next
def __init__(self):
self.next = None
def push(self, data = None, index = 0):
if index < 0 or index > len(self):
raise IndexError("Given index is invalid.")
cur = self
for i in range(index):
cur = cur.next
cur.next = Node(data, cur.next)
def pop(self, index = 0):
if index < 0 or index >= len(self):
raise IndexError("Given index is invalid.")
cur = self
for i in range(index):
cur = cur.next
retval = cur.next.data
cur.next = cur.next.next
return retval
def __iter__(self):
cur = self
while cur.next is not None:
yield cur.next.data
cur = cur.next
def __len__(self):
len = 0
cur = self
while cur.next is not None:
len = len + 1
cur = cur.next
return len
def __str__(self):
cur = self
if cur.next is None:
return "[]"
st = "["
while cur.next.next is not None:
st = st + str(cur.next.data) + ", "
cur = cur.next
st = st + str(cur.next.data) + "]"
return st
测试:
s = Stack()
print(s)
s.push(1)
print(s)
s.push(0.5)
print(s)
s.push(1.5, 1)
print(s)
s.push(2, 3)
print(s)
print(s.pop())
print(s)
print(s.pop(2))
print(s)
输出:
[]
[1]
[0.5, 1]
[0.5, 1.5, 1]
[0.5, 1.5, 1, 2]
0.5
[1.5, 1, 2]
2
[1.5, 1]
Python Linked List的更多相关文章
- LeetCode with Python -> Linked List
21. Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new list s ...
- python 实现单链表
#! /usr/bin/env python ### ### Linked List python implementation ### ### @reference Data Structures ...
- [LeetCode]题解(python):114 Flatten Binary Tree to Linked List
题目来源 https://leetcode.com/problems/flatten-binary-tree-to-linked-list/ Given a binary tree, flatten ...
- [LeetCode]题解(python):092 Reverse Linked List II
题目来源 https://leetcode.com/problems/reverse-linked-list-ii/ Reverse a linked list from position m to ...
- 【算法分析】如何理解快慢指针?判断linked list中是否有环、找到环的起始节点位置。以Leetcode 141. Linked List Cycle, 142. Linked List Cycle II 为例Python实现
引入 快慢指针经常用于链表(linked list)中环(Cycle)相关的问题.LeetCode中对应题目分别是: 141. Linked List Cycle 判断linked list中是否有环 ...
- 【LeetCode】237. Delete Node in a Linked List 解题报告 (Java&Python&C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 设置当前节点的值为下一个 日期 [LeetCode] ...
- 【LeetCode】206. Reverse Linked List 解题报告(Python&C++&java)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 迭代 递归 日期 [LeetCode] 题目地址:h ...
- 【LeetCode】141. Linked List Cycle 解题报告(Java & Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双指针 保存已经走过的路径 日期 [LeetCode ...
- 【LeetCode】1019. Next Greater Node In Linked List 解题报告 (Python&C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 单调递减栈 日期 题目地址:https://leetc ...
随机推荐
- CollectionView垂直缩放卡片布局
实现效果 实现思路 从效果图可以看到变化是,越是往中间滚动的item显示最大,越显眼.而越是往前面,或者越是后面的,反而显示越小,这样就形成了视觉差. 实现的思路就是通过重写在可见范围内的所有item ...
- 【USACO 2006 November Gold】Corn Fields
[题目链接] 点击打开链接 [算法] 状压DP [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 12 #def ...
- 我自己常用的Watir自动化测试结果报表
特别声明:该报表框架不是我搭建的.
- MYSQL数据库学习----查询
查询语句是MYSQL数据库中用到的最多的语句. 查询语句分为几种 单表查询 集合函数查询 连接查询 子查询 合并查询 正则表达式查询 一:单表查询 SELECT 属性 FROM 表名 [WHERE 查 ...
- 推荐几本javascript与jquery的好书
有人说只要了解了javascript的基本语法,就可以通过看别人的代码来学习javascript了,我不敢苟同.代码是死的,它很难让你有自己的想法,而一本好书如果结构清晰,各个章节都立意明确循序渐进( ...
- 《Eye In-Painting with Exemplar Generative Adversarial Networks》论文阅读笔记
Abstract 基于conditional GAN使用隐藏在reference image中的exemplar information生成high-quality,personalized in-p ...
- python 查找IP地址归属地
#!/usr/bin/env python # -*- coding: utf-8 -*- #查找IP地址归属地 #writer by keery_log #Create time:2013-10-3 ...
- 从开发的角度对zigbee安全的杂谈
说起zigbee应该很少人听过,这个B名字怪怪的... 以前开发不懂开发的思想,前前后后花了很久时间,现在回想起来,突然想从安全的角度来理解数据的传输 废话:伴随科技的快速演进,物联网(The Int ...
- .NET Core 3.0之深入源码理解Configuration(二)
文件型配置基本内容 上一篇文章讨论了Configuration的几个核心对象,本文继续讨论Configuration中关于文件型配置的相关内容.相比较而言,文件型配置的使用场景更加广泛,用户自定义 ...
- Android笔记---常用控件以及用法
这篇文章主要记录下Android的常用控件以及使用的方法,Android 给我们提供了大量的UI控件,合理地使用这些控件就可以非常轻松地编写出相当不错的界面,这些是Android学习的基础,没有什么业 ...