[DS+Algo] 003 一维表结构 Python 代码实现
- 接上一篇
前言
- 本篇共 3 个代码实现
- 严格来说
code1相当于模仿了 Python 的 list 的部分简单功能code2与code3简单实现了“循环单链表”与“双链表”
- 代码比较简单,但它们的行数相比于普通博文又显得有些长,所以单独写一篇
- 其实放到 GitHub 上更合适,我打算积几个再去 push
1. 模仿 Python 的 list 的一些功能
class SingleNode(object):
def __init__(self, item):
self.item = item
self.next = None
class SingleLinkList(object):
def __init__(self):
self._head = None
def is_empty(self):
return self._head is None
def length(self):
cur = self._head
count = 0
while cur is not None:
count += 1
cur = cur.next
return count
def traverse(self):
cur = self._head
while cur:
print(cur.item)
cur = cur.next
return None
def add_first(self, item):
node = SingleNode(item)
node.next = self._head
self._head = node
def append(self, item):
node = SingleNode(item)
if self.is_empty():
self._head = node
else:
cur = self._head
while cur.next:
cur = cur.next
cur.next = node
def insert(self, pos, item):
if pos <= 0:
self.add_first(item)
elif (self.length() - 1) < pos:
self.append(item)
else:
node = SingleNode(item)
count = 0
pre = self._head
while count < (pos - 1):
count += 1
pre = pre.next
node.next = pre.next
pre.next = node
def remove(self, item):
cur = self._head
pre = None
while cur:
if cur.item == item:
if not pre:
self._head = cur.next
else:
pre.next = cur.next
break
else:
pre = cur
cur = cur.next
def search(self, item):
cur = self._head
while cur:
if cur.item == item:
return True
cur = cur.next
return False
if __name__ == "__main__":
lst = SingleLinkList()
lst.add_first(10)
lst.add_first(20)
lst.append(30)
lst.insert(2, 40)
print(f"Length of lst is {lst.length()}")
lst.traverse()
print(lst.search(30))
print(lst.search(31))
lst.remove(20)
print(f"Length of lst is {lst.length()}")
lst.traverse()
2. 循环单链表
class SingleNode(object):
def __init__(self, item):
self.item = item
self.next = None
class SingleCycLinkedList(object):
def __init__(self):
self._head = None
def is_empty(self):
return self._head is None
def length(self):
if self.is_empty():
return 0
cnt = 1
cur = self._head
while cur.next != self._head:
cur = cur.next
cnt += 1
return cnt
def traverse(self):
if self.is_empty():
return
cur = self._head
print(cur.item)
while cur.next != self._head:
cur = cur.next
print(cur.item)
def add_first(self, item):
node = SingleNode(item)
if self.is_empty():
self._head = node
node.next = self._head
else:
node.next = self._head
cur = self._head
while cur.next != self._head:
cur = cur.next
cur.next = node
self._head = node
def append(self, item):
node = SingleNode(item)
if self.is_empty():
self._head = node
node.next = self._head
else:
cur = self._head
while cur.next != self._head:
cur = cur.next
cur.next = node
node.next = self._head
def insert(self, pos, item):
if pos <= 0:
self.add_first(item)
elif self.length() - 1 < pos:
self.append(item)
else:
node = SingleNode(item)
cur = self._head
cnt = 0
while cnt < pos - 1:
cur = cur.next
cnt += 1
node.next = cur.next
cur.next = node
def remove(self, item):
if self.is_empty():
return
cur = self._head
pre = None
if cur.item == item:
if cur.next != self._head:
while cur.next != self._head:
cur = cur.next
cur.next = self._head.next
self._head = self._head.next
else:
self._head = None
else:
pre = self._head
while cur.next != self._head:
if cur.item == item:
pre.next = cur.next
return
else:
pre = cur
cur = cur.next
if cur.item == item:
pre.next = cur.next
def search(self, item):
if self.is_empty():
return False
cur = self._head
if cur.item == item:
return True
while cur.next != self._head:
cur = cur.next
if cur.item == item:
return True
return False
if __name__ == "__main__":
lst = SingleCycLinkedList()
lst.add_first(2)
lst.add_first(1)
lst.append(4)
lst.append(5)
lst.insert(0, 0)
lst.insert(3, 33)
print(f"length: {lst.length()}")
lst.traverse()
print(lst.search(3))
print(lst.search(5))
lst.remove(33)
print(f"length: {lst.length()}")
lst.traverse()
3. 双链表
class Node(object):
def __init__(self, item):
self.item = item
self.next = None
self.prev = None
class DLinkList(object):
def __init__(self):
self._head = None
def is_empty(self):
return self._head is None
def length(self):
cur = self._head
cnt = 0
while cur:
cnt += 1
cur = cur.next
return cnt
def traverse(self):
cur = self._head
while cur:
print(cur.item)
cur = cur.next
def add_first(self, item):
node = Node(item)
if self.is_empty():
self._head = node
else:
node.next = self._head
self._head.prev = node
self._head = node
def append(self, item):
node = Node(item)
if self.is_empty():
self._head = node
else:
cur = self._head
while cur.next:
cur = cur.next
cur.next = node
node.prev = cur
def search(self, item):
cur = self._head
while cur:
if cur.item == item:
return True
cur = cur.next
return False
def insert(self, pos, item):
if pos <= 0:
self.add_first(item)
elif self.length() - 1 < pos:
self.append(item)
else:
node = Node(item)
cur = self._head
cnt = 0
while cnt < pos - 1:
cur = cur.next
cnt += 1
node.prev = cur
node.next = cur.next
cur.next.prev = node
cur.next = node
def remove(self, item):
if self.is_empty():
return
else:
cur = self._head
if cur.item == item:
if cur.next is None:
self._head = None
else:
cur.next.prev = None
self._head = cur.next
return
cur = cur.next
while cur:
if cur.item == item:
cur.prev.next = cur.next
cur.next.prev = cur.prev
break
cur = cur.next
if __name__ == "__main__":
lst = DLinkList()
lst.add_first(2)
lst.add_first(1)
lst.append(4)
lst.append(5)
lst.insert(0, 0)
lst.insert(3, 33)
print(f"length: {lst.length()}")
lst.traverse()
print(lst.search(3))
print(lst.search(5))
lst.remove(33)
print(f"length: {lst.length()}")
lst.traverse()
[DS+Algo] 003 一维表结构 Python 代码实现的更多相关文章
- [DS+Algo] 002 一维表结构
目录 1. 顺序表 1.1 分类 1.2 实现方式 1.3 扩容问题 1.4 操作 2. 链表 2.1 分类 2.2 链表相关操作 2.3 链表 VS 顺序表 3. 关于代码实现 1. 顺序表 1.1 ...
- [DS+Algo] 004 栈、队列及其代码实现
1. Stack FILO (FirstInLastOut) 的链表结构 在程序编译环境上使用较多 常用操作 push pop peek is_empty size Python 代码示例 class ...
- 一段关于用户登录 和乘法表的python代码
用户登录代码(低配): name = 1password =11counter = 1while counter <3 : a = int(input ('name:')) #注意这里 inpu ...
- python 全栈开发,Day105(路飞其他数据库表结构,立即结算需求)
考试第三部分:Django 16. 列列举你熟悉的Http协议头以及作用.(1分) Accept-Charset: 用于告诉浏览器,客户机采用的编码 Host: 客户机通过这个头告诉服务器,想访问的 ...
- python 全栈开发,Day98(路飞学城背景,django ContentType组件,表结构讲解)
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...
- DS实验题 Old_Driver UnionFindSet结构 指针实现邻接表存储
题目见前文:DS实验题 Old_Driver UnionFindSet结构 这里使用邻接表存储敌人之间的关系,邻接表用指针实现: // // main.cpp // Old_Driver3 // // ...
- 开源一个适用iOS的数据库表结构更新机制的代码
将前段时间开源的代码.公布一下: ARDBConfig On the iOS, provide a database table structure update mechanism, ensure ...
- 【转】Informix数据表结构分析资料整理之约束查询代码
原文地址:http://blog.csdn.net/xqf222/article/details/6271219 本文主要整理了Informix数据库相关系统表数据,已分析整个Informix数据表结 ...
- Python SQLAlchemy多对多外键关联时表结构
# 创建多对多表结构 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.engine import cre ...
随机推荐
- vue interceptors(拦截器)
拦截器 顾名思义: 就是半路个您劫持, 拦截器 其实在项目和自己写demo中,总会遇到请求方面需要在请求头里面做判断或者添加一些东西, 这时候 vue 中应用中axios的 interceptors ...
- k-means伪代码
1.初始化k个簇中心. 2.更新所有样本点簇归属:样本点到哪个簇中心点最近就属于哪个簇. 3.重新计算每个簇的中心点(直到簇中心点不再变化或达到更新最大次数) #k-means伪代码 import n ...
- electron打包成.exe后限制只启动一个应用
注意:这是2.x的文档 const {app} = require('electron') let myWindow = null const shouldQuit = app.makeSingleI ...
- Zabbix MySQL监控模板添加
zabbix自带的mysql监控指标很少,所以需要新增一些监控项 1.下载知数堂维护的percona-monitoring-plugin-zabbix代码 # cd /opt # wget https ...
- SQL 行转列(列的值不规则的数目)
--创建一个临时表用来存储数据 create table #tmp_SNValue_Table (FieldName nvarchar(20), [Value] nvarchar(max)) inse ...
- 模型层ORM操作
一.ORM操作 1.关键性字段及参数 DateField 年月日 DateTimeField 年月日时分秒 auto_now: 每次操作改数据都会自动更新时间 auto_now_add: 新增数据的时 ...
- jQuery_完成省市二级联动
当填表的时候会让你设计某省某市怎么设计,应该明白,如果你选择了一个确定的省,那么在第二个下拉框内则不会有除了你选择的省的市之外的名称.而这功能用js来实现很麻烦,但是用jq确很容易实现. 原表结构: ...
- CCPC哈尔滨E题
一堆序列拼接起来,找出现次数大于n/2的数 假设一个数出现次数大于n/2 那么它减去其他数出现的次数一定非负: = c) { cnt += t[i]; } } } } //cout<<c& ...
- 从零开始,编写简单的课程信息管理系统(使用jsp+servlet+javabean架构)
一.相关的软件下载和环境配置 1.下载并配置JDK. 2.下载eclipse. 3.下载并配置apache-tomcat(服务器). 4.下载MySQL(数据库). 5.下载Navicat for M ...
- 大数据笔记(二十八)——执行Spark任务、开发Spark WordCount程序
一.执行Spark任务: 客户端 1.Spark Submit工具:提交Spark的任务(jar文件) (*)spark提供的用于提交Spark任务工具 (*)example:/root/traini ...