• 接上一篇

前言

  • 本篇共 3 个代码实现
  • 严格来说
    • code1 相当于模仿了 Python 的 list 的部分简单功能
    • code2code3 简单实现了“循环单链表”与“双链表”
  • 代码比较简单,但它们的行数相比于普通博文又显得有些长,所以单独写一篇
  • 其实放到 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 代码实现的更多相关文章

  1. [DS+Algo] 002 一维表结构

    目录 1. 顺序表 1.1 分类 1.2 实现方式 1.3 扩容问题 1.4 操作 2. 链表 2.1 分类 2.2 链表相关操作 2.3 链表 VS 顺序表 3. 关于代码实现 1. 顺序表 1.1 ...

  2. [DS+Algo] 004 栈、队列及其代码实现

    1. Stack FILO (FirstInLastOut) 的链表结构 在程序编译环境上使用较多 常用操作 push pop peek is_empty size Python 代码示例 class ...

  3. 一段关于用户登录 和乘法表的python代码

    用户登录代码(低配): name = 1password =11counter = 1while counter <3 : a = int(input ('name:')) #注意这里 inpu ...

  4. python 全栈开发,Day105(路飞其他数据库表结构,立即结算需求)

    考试第三部分:Django 16.  列列举你熟悉的Http协议头以及作用.(1分) Accept-Charset: 用于告诉浏览器,客户机采用的编码 Host: 客户机通过这个头告诉服务器,想访问的 ...

  5. python 全栈开发,Day98(路飞学城背景,django ContentType组件,表结构讲解)

    昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...

  6. DS实验题 Old_Driver UnionFindSet结构 指针实现邻接表存储

    题目见前文:DS实验题 Old_Driver UnionFindSet结构 这里使用邻接表存储敌人之间的关系,邻接表用指针实现: // // main.cpp // Old_Driver3 // // ...

  7. 开源一个适用iOS的数据库表结构更新机制的代码

    将前段时间开源的代码.公布一下: ARDBConfig On the iOS, provide a database table structure update mechanism, ensure ...

  8. 【转】Informix数据表结构分析资料整理之约束查询代码

    原文地址:http://blog.csdn.net/xqf222/article/details/6271219 本文主要整理了Informix数据库相关系统表数据,已分析整个Informix数据表结 ...

  9. Python SQLAlchemy多对多外键关联时表结构

    # 创建多对多表结构 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.engine import cre ...

随机推荐

  1. java——HttpClient 代理模式发送Http Https

    在setProxy()方法中设置代理IP后可以将url中的域名换成这个代理IP. http很简单,但是https这样会报错. 问题:如何使用代理发送https请求? 客户端发送https请求之前会先向 ...

  2. python深度学习:矩阵转置(transpose)

    转置:即行列转换. import numpy as np import matplotlib.pyplot as plt C=np.array([[1,2,3],[4,5,6]]) # Display ...

  3. SPOJ D-query && HDU 3333 Turing Tree (线段树 && 区间不相同数个数or和 && 离线处理)

    题意 : 给出一段n个数的序列,接下来给出m个询问,询问的内容SPOJ是(L, R)这个区间内不同的数的个数,HDU是不同数的和 分析 : 一个经典的问题,思路是将所有问询区间存起来,然后按右端点排序 ...

  4. Devexpress MVC GridView / CardView (持续更新)

    //获取gridview里面的combo box 显示的文本 //获取某个column在gridview的 index RightGridView.GetColumnByField("Fun ...

  5. 2019.9.23JAVA课堂测试

    1.题目 使用递归方式判断某个字串是否是回文( palindrome ) “回文”是指正着读.反着读都一样的句子.比如“我是谁是我”使用递归算法检测回文的算法描述如下:A single or zero ...

  6. Redis单节点部署

    安装Redis 由于REDIS使用单线程处理请求,CPU的快慢最对REDIS的性能有较大影响,官方建议INTEL的CPU,其效率能比AMD高一倍左右. 下载Redis:wget http://down ...

  7. [nginx] CORS配置多域名

    如下 server { listen 80; server_name www.your.com; root /data/web/www.your.com; access_log /var/log/ng ...

  8. OOM和SOF代码

    OutOfMemoryError大数组,例如图片加载. public class MockOutOfMemoryError { public static void main(String[] arg ...

  9. 读写锁StampedLock的思想

    该类是一个读写锁的改进,它的思想是读写锁中读不仅不阻塞读,同时也不应该阻塞写. 读不阻塞写的实现思路: 在读的时候如果发生了写,则应当重读而不是在读的时候直接阻塞写! 因为在读线程非常多而写线程比较少 ...

  10. MySQL课下作业

    目录 MySQL 实验内容 实验代码 实验截图 代码链接 MySQL 实验内容 下载附件中的world.sql.zip, 参考http://www.cnblogs.com/rocedu/p/63713 ...