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 ...
随机推荐
- UIButton常见属性和方法
一.创建,两种方法: 1. 常规的 initWithFrame UIButton *btn1 = [[UIButton alloc]initWithFrame:CGRectMake(10, 10, 8 ...
- 小程序不支持wx.request同步请求解决方法
小程序为了用户体验,所有的request均为异步请求,不会阻塞程序运行 百牛信息技术bainiu.ltd整理发布于博客园 所以当你需要同步请求,锁死操作时,最好将所有的逻辑写在success:func ...
- 使用Cocos2dx-JS开发一个飞行射击游戏
一.前言 笔者闲来无事,某天github闲逛,看到了游戏引擎的专题,引起了自己的兴趣,于是就自己捣腾了一下Cocos2dx-JS.由于是学习,所谓纸上得来终觉浅,只是看文档看sample看demo,并 ...
- RESTEasy使用json返回的例子
创建一个json的model类: package com.howtodoinjava.model; import java.io.Serializable; import javax.xml.bind ...
- E20180419-hm
rectangle n. [数] 长方形,矩形; ratio n. 比例; 比,比率; 系数; vt. 求出比值,除,使…成比例; 将(相片)按比例放大[缩小]; aspect n. 方面; 面貌 ...
- (水题)洛谷 - P1618 - 三连击(升级版)
https://www.luogu.org/problemnew/show/P1618 枚举所有的A,最多 $A_9^3$ ,然后生成B和C(先判断是不是能够生成),判断有没有重复数字(比之前那个优雅 ...
- bzoj 2251: [2010Beijing Wc]外星联络【SA】
先求SA,然后按字典序从小到大枚举子串,每到一个后缀从长到短枚举子串(跳过长为he[i]的和前一段重复的子串),然后维护一个点p,保证i~p之间最小的he>=当前枚举长度,p是单调向右移的 然后 ...
- bzoj 3625: [Codeforces Round #250]小朋友和二叉树【NTT+多项式开根求逆】
参考:https://www.cnblogs.com/2016gdgzoi509/p/8999460.html 列出生成函数方程,g(x)是价值x的个数 \[ f(x)=g(x)*f^2(x)+1 \ ...
- git 项目切换分支 命令
在项目开发总,一般都会用到git管理工具,有的公司可能还是用的svn:不管怎么样.用的顺手就行: 来说下git 的基本使用 git clone + 项目地址链接: 可以把项目克隆到本地: 然后一般顺序 ...
- Linux下tcp服务器创建的步骤
创建一个socket,使用函数socket() socket(套接字)实质上提供了进程通信的端点,进程通信之前,双方首先必须建立各自的一个端点,否则没有办法通信.通过socket将IP地址和端口绑定之 ...