数据结构中的顺序表和链表(Python语言)
转载:https://blog.csdn.net/weixin_43187669/article/details/96426362
算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体。
Python提供现成的数据结构类型叫做Python的内置数据结构,比如列表、元组、集合、字典。
Python系统里面没有直接定义需要自定义的成为Python的扩展数据结构,比如栈、队列等。
顺序表的基本形式
1.定义:所谓顺序表,就是将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由他们的存储顺序自然表示。
图a,每个元素所占存储单元大小固定相同。
图b,每个元素所占的存储单元大小不相同。存储一个链接地址。
顺序表的结构与实现
顺序表的两种基本实现方式
图a为一体式结构,存储表信息的单元与元素存储区以连续的方式安排在一快存储区里。
图b为分离式结构,存储表信息的单元与元素存储区以连续的方式安排在两块存储区里。
元素存储区替换
一体式结构:若想更换数据区,则只能整体搬迁,即整个顺序表对象改变了。
分离式结构:若想更换数据区,只需要将信息区中的数据区链接地址更新即可,而该顺序表对象不变。
元素存储区扩充
1.只有分离式结构的元素存储区可以扩充。
2.扩充的两种策略:
1)每次扩充增加固定数目的存储位置,如每次扩充增加10个元素位置。
特点:节省空间,但是扩充操作频繁,操作次数多。
2)每次扩充容量加倍,如每次扩充增加一倍存储空间。
特点:减少了扩充操作的执行此书,但可能会浪费空间资源。以空间换时间,推荐此方式。
顺序表的操作
1.增加元素的三种方式。
Python中的顺序表
Python中的list和turple两种类型采用了顺序表的实现技术。
list是可变类型,即采用分离式技术实现的动态顺序表。
turple是不可变型,即不变的顺序表。
list的基本丝线技术
1.Python标准类型list就是一种元素个数可变的线性表,可以加入和删除元素,具有以下特征:(1)顺序表:基于下标的高效元素访问和更新,时间复杂度是O(1);
(2)分离式技术:允许任意加入元素,而且在不断加入元素的过程中,表对象的id不变。
list元素存储区扩充规则
1.在建立空表(或者很小的表)时,系统分配一块能容纳8个元素的存储区;
2. 在执行插入操作(insert或append)时,如果元素存储区满就换一块4倍大的存储区。
3. 如果此时的表已经很大(目前的阀值为50000),则改变策略,采用加一倍的方法。
原因: 为了避免出现过多空闲的存储位置。
链表
顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行空充时又需要进行数据的搬迁,所以使用起来并不是很灵活,但是链表结构可以充分利用计算机的内存空间,实现灵活的内存动态管理。
1.链表的定义:链表是一种常见的基础书籍结构,是一只种类线性表,但是不想顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息。(即地址)
单链表
1.单链表的定义:单向链表也叫单链表,每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。
2.节点实现:
class SingleNode(object):
"""单链表的节点“”“
def ——init——(self,item):
#item存放数据元素
self。item = item
#next是下一个结点的标示
self.
3.单链表的操作
length() 链表长度
travel() 遍历整个链表
add(item) 链表头部添加元素
append(item) 链表尾部添加元素
insert(pos, item) 指定位置添加元素
remove(item) 删除节点
search(item)查找节点是否存在
is_empty() 链表是否为空
4.单链表的头部添加元素与尾部添加元素
5.单链表在指定位置添加元素
6.删除节点
链表与顺序表的对比:
单向循环链表
1.单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。
2.单向链表的操作及其实现:
函数名 功能
length() 链表长度
travel() 遍历整个链表
add(item) 链表头部添加元素
append(item) 链表尾部添加元素
insert(pos, item) 指定位置添加元素
remove(item) 删除节点
search(item) 查找节点是否存在
is_empty() 链表是否为空
双向链表
特点:每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。
指定位置添加节点算法示意图:
2.删除元素算法示意图:
class Node(object):
def __init__(self, element):
self.element = element
# 数据域
self.next = None
self.prev = None def __str__(self):
return self.elelemnt class DuLinkList(object):
def __init__(self):
self.head = None def is_empty(self):
return self.head == None
#判空
def __len__(self):
if self.is_empty():
return 0
cur = self.head
linkLen = 0
while cur:
cur = cur.next
linkLen += 1
return linkLen
#计算长度
def travel(self):
if not self.is_empty():
cur = self.head
while cur.next != None:
print(cur.element, end=',')
cur = cur.next
print(cur.element)
else:
print('空链表')
#遍历每个元素
def add(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 != None:
cur = cur.next
cur.next = node
node.prev = cur
#在链表尾部添加节点
def insert(self, index, item):
if index <= 0:
self.add(item)
elif index >= len(self):
self.append(item)
else:
node = Node(item)
count = 0
cur = self.head
while count <= index - 1:
count += 1
cur = cur.next
node.next = cur.next
cur.next = node
node.prev = cur
#插入节点
def remove(self,item):
pre = None
cur = self.head
if cur.element == item:
self.head = self.head.next
else:
while cur:
if cur.element != item:
pre = cur
cur = cur.next
else:
pre.next = cur.next
cur.prev = pre.next
break
#删除节点 if __name__ == '__main__':
link = DuLinkList()
print("链表长度:", len(link))
link.travel()
print('链表是否为空?', link.is_empty())
print('添加头结点:')
for item in range(5):
link.append(item)
print('链表长度:', len(link))
link.insert(1, 'python')
数据结构中的顺序表和链表(Python语言)的更多相关文章
- 数据结构中有关顺序表的问题:为何判断插入位置是否合法时if语句中用length+1,而移动元素的for语句中只用length?
bool ListInsert(SqList &L,int i, ElemType e){ if(i<||i>L.length+) //判断i的范围是否有效 return fals ...
- [Python] 数据结构--实现顺序表、链表、栈和队列
说明: 本文主要展示Python实现的几种常用数据结构:顺序表.链表.栈和队列. 附有实现代码. 来源主要参考网络文章. 一.顺序表 1.顺序表的结构 一个顺序表的完整信息包括两部分,一部分是表中元素 ...
- 线性表 及Java实现 顺序表、链表、栈、队列
数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...
- 【PHP数据结构】线性表?顺序表?链表?别再傻傻分不清楚
遵从所有教材以及各类数据结构相关的书书籍,我们先从线性表开始入门.今天这篇文章更偏概念,是关于有线性表的一个知识点的汇总. 上文说过,物理结构是用于确定数据以何种方式存储的.其他的数据结构(树.图). ...
- K:顺序表和链表的比较
顺序表和链表是线性表的两种基本实现形式(链表还有多种变化形式),对于这两种实现方式,没有一种方法可以称是最好的,他们各自有着各自的特点和优缺点,适用于不同的应用场景. 与顺序表相比,链表较为灵活, ...
- c数据结构 顺序表和链表 相关操作
编译器:vs2013 内容: #include "stdafx.h"#include<stdio.h>#include<malloc.h>#include& ...
- C#顺序表 & 单向链表(无头)
C# 顺序表 非常标准的顺序表结构,等同于C#中的List<T>,但是List<T>在排错查询和数据结构替换上存在缺陷,一些情况会考虑使用自己定义的数据结构 1.优化方向 下表 ...
- java实现顺序表、链表、栈 (x)->{持续更新}
1.java实现节点 /** * 节点 * @luminous-xin * @param <T> */ public class Node<T> { T data; Node& ...
- 数据结构:队列 链表,顺序表和循环顺序表实现(python版)
链表实现队列: 尾部 添加数据,效率为0(1) 头部 元素的删除和查看,效率也为0(1) 顺序表实现队列: 头部 添加数据,效率为0(n) 尾部 元素的删除和查看,效率也为0(1) 循环顺序表实现队列 ...
随机推荐
- Bug(1)
程序要求:内网之间客户端截屏(.bmp)并传送给服务端. server: #include <winsock2.h> // 为了使用Winsock API函数 #include <s ...
- RAC,ReactiveSwift
1.创建信号 // 1.通过信号发生器创建(冷信号) let producer = SignalProducer<String, NoError>.init { (observer, _) ...
- 翻译——2_Linear Regression and Support Vector Regression
续上篇 1_Project Overview, Data Wrangling and Exploratory Analysis 使用不同的机器学习方法进行预测 线性回归 在这本笔记本中,将训练一个线性 ...
- linux系统终端介绍
https://zhidao.baidu.com/question/174261014.html
- flask web实战1.27
1.在pycharm的terminal中输入 生成requirements.txt文件 pip freeze > requirements.txt 安装requirements.txt依赖 pi ...
- Python笔记_第四篇_高阶编程_py2与py3的区别
1. 性能: py3.x起始比py2.x效率低,但是py3.x现有极大的优化空间,效率正在追赶. 2. 编码: py3.x原码文件默认使用的utf-8编码,使得变量名更为宽阔. 3. 语法: * 去除 ...
- LeetCode——15. 三数之和
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...
- 01 语言基础+高级:1-7 异常与多线程_day05 【异常、线程】
day05 [异常.线程] 主要内容 异常.线程 教学目标 能够辨别程序中异常和错误的区别 说出异常的分类 说出虚拟机处理异常的方式 列举出常见的三个运行期异常 能够使用try...catch关键字处 ...
- iso镜像文件的挂载和yum库的搭建
挂载镜像文件 1.上传镜像文件到服务器(或电脑)的某一目录下 如:(/media/rpm_pack/rhel...iso) 2.root 用户下创建镜像文件挂载目录 mkdir /mnt/vcd ...
- PAT甲级——1008 Elevator
PATA1008 Elevator The highest building in our city has only one elevator. A request list is made up ...