【python】数据结构和算法 + 浅谈单链表与双链表的区别

有这么一句话说“程序=数据结构+算法”,也有人说“如果把编程比作做菜,那么数据结构就好比食材(菜),算法就好比厨艺(做菜的技巧)”。

当然这是笼统的说法,不过也稍微懂得了数据结构和算法的重要性了。

其实,数据结构是数据间的有机关系,而算法是对数据的操作步骤;两者不可分开来谈,不能脱离算法来讨论数据结构,也不能脱离数据结构研究算法。

在网上看到这样一段话:

数据结构并不是来教你怎样编程的,同样编程语言的精练也不在数据结构的管辖范围之内,那是教你学习一门语言的老师的事情,他肯定不想因为数据结构而失业。数据结构是教你如何在现有程序的基础上把它变得更优(运算更快,占用资源更少),它改变的是程序的存储运算结构而不是程序语言本身。

如果把程序看成一辆汽车,那么程序语言就构成了这辆车的车身和轮胎。而算法则是这辆车的核心——发动机。这辆车跑得是快是慢,关键就在于发动机的好坏(当然轮胎太烂了也不行),而数据结构就是用来改造发动机的。

可以这么说,数据结构并不是一门语言,它是一种思想,一种方法,一种思维方式。它并不受语言的限制,你完全可以在gave 中轻而易举地实现一个用C语言给出的算法。

或许你在初入职场的时候并不会涉及到需要使用到数据结构的地方,也因而觉得数据结构貌似没用,但这和“农民工也能盖大楼,干嘛还学建筑呢?” 是一个道理,应该都懂。

前面说了超长的废话,其实我是想介绍一些数据结构的学习资源,主要针对编程新手,希望可以解决新手们“如何学习数据结构”的困惑,若对你有所帮助,那真是极好的。

 

浅谈单链表与双链表的区别

用代码解释两种结构---

单链表:

class Node:def __init__(self, data):self.data = dataself.next = Nonedef __str__(self):return str(self.data)# 通过单链表构建一个list的结构: 添加  删除  插入   查找 获取长度  判断是否为空...
# list1 = []  list1.append(5)     [5,]             slist =  SingleList()   slist.append(5)
class SingleList:def __init__(self, node=None):self._head = nodedef isEmpty(self):return self._head == Nonedef append(self, item):# 尾部添加node = Node(item)if self.isEmpty():self._head = nodeelse:cur = self._headwhile cur.next != None:cur = cur.nextcur.next = node# 求长度def len(self):cur = self._headcount = 0while cur != None:count += 1cur = cur.nextreturn count# 遍历def print_all(self):cur = self._headwhile cur != None:print(cur)cur = cur.nextdef pop(self, index):if index < 0 or index >= self.len():raise IndexError('index Error')if index == 0:self._head = self._head.nextelse:cur = self._head# 找到当前下标的前一个元素while index - 1:cur = cur.nextindex -= 1# 修改的next的指向位置cur.next = cur.next.nextdef insert(self, index, item):if index < 0 or index >= self.len():raise IndexError('index Error')if isinstance(item, Node):raise TypeError('不能是Node类型')else:node = Node(item)if index == 0:node.next = self._headself._head = nodeelse:cur = self._headwhile index - 1:cur = cur.nextindex -= 1node.next = cur.nextcur.next = nodedef update(self, index, new_item):if index < 0 or index >= self.len():raise IndexError('index Error')if isinstance(new_item, Node):raise TypeError('不能是Node类型')else:node = Node(new_item)if index == 0:node.next = self._head.nextself._head = nodeelse:cur = self._headnode.next = cur.next.nextcur.next = nodedef remove(self, item):if isinstance(item, Node):raise TypeError('不能是Node类型')else:node = Node(item)cur = self._headwhile cur == node:cur = cur.nextcur.next = cur.next.nextif __name__ == '__main__':slist = SingleList()print(slist.isEmpty())  # Trueprint(slist.len())slist.append(5)print(slist.isEmpty())  # Falseprint(slist.len())  # 1slist.append(8)slist.append(6)slist.append(3)slist.append(1)print(slist.isEmpty())  # Trueprint(slist.len())print('---------------------')slist.print_all()print('----------pop-------------')slist.pop(2)slist.print_all()print('--------insert-------')slist.insert(1, 19)slist.print_all()print('--------update-------')slist.update(1, 18)slist.print_all()print('--------remove-------')slist.remove(18)slist.print_all()

双链表:

'''
双向链表
'''class Node:def __init__(self, data):self.data = dataself.next = Noneself.prev = Nonedef __str__(self):return str(self.data)class DoubleList:def __init__(self):self._head = Nonedef isEmpty(self):return self._head == Nonedef append(self, item):# 尾部添加node = Node(item)if self.isEmpty():self._head = nodeelse:cur = self._headwhile cur.next != None:cur = cur.nextcur.next = node# 求长度def add(self, item):node = Node(item)if self.isEmpty():self._head = nodeelse:node.next = self._headself._head.prev = nodeself._head = nodedef len(self):cur = self._headcount = 0while cur != None:count += 1cur = cur.nextreturn countdef print_all(self):cur = self._headwhile cur != None:print(cur)cur = cur.nextdef insert(self, index, item):if index < 0 or index >= self.len():raise IndexError('index Error')if isinstance(item, Node):raise TypeError('不能是Node类型')else:node = Node(item)if index == 0:node.next = self._headnode.prev = self._head.prevself._head = nodeelse:cur = self._headwhile index - 1:cur = cur.nextindex -= 1node.next = cur.nextnode.prev = cur.prevcur.next = nodecur.prev = node.prevdef remove(self, item):if isinstance(item, Node):raise TypeError('不能是Node类型')else:node = Node(item)cur = self._headwhile cur == node:cur = cur.nextcur.next = cur.next.nextcur.prev = cur.prevdef update(self, index, new_item):if index < 0 or index >= self.len():raise IndexError('index Error')if isinstance(new_item, Node):raise TypeError('不能是Node类型')else:node = Node(new_item)if index == 0:node.next = self._head.nextnode.prev = self._head.prevself._head = nodeelse:cur = self._headnode.next = cur.next.nextnode.prev = cur.prevcur.next = nodecur.prev = nodeif __name__ == '__main__':dlist = DoubleList()print(dlist.len())print(dlist.isEmpty())# dlist.append(6)# dlist.append(9)# dlist.append(5)# print(dlist.len())# print(dlist.isEmpty())# dlist.print_all()dlist.add(6)dlist.add(9)dlist.add(5)dlist.print_all()print('--------insert-------')dlist.insert(1, 19)dlist.print_all()print('--------update-------')dlist.update(1, 18)dlist.print_all()print('--------remove-------')dlist.remove(18)dlist.print_all()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456577.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webpack使用优化(基本篇)

转自&#xff1a;https://github.com/lcxfs1991/blog/issues/2 前言 本文不是webpack入门文章&#xff0c;如果对webpack还不了解&#xff0c;请前往题叶的Webpack入门&#xff0c;或者阮老师的Webpack-Demos。 为什么要使用Webpack 与react一类模块化开发的框架搭配着用比较好…

word2vec中单词向词向量的转换过程详解

目录前言&#xff1a;1、Word2Vec两种模型的大致印象2、CBOW模型流程举例3、CBOW模型流程举例总结&#xff1a; 目录 前言&#xff1a; 针对word2vec是如何得到词向量的&#xff1f;这篇文章肯定能解决你的疑惑。该篇文章主要参考知乎某大神的回答&#xff0c;个人在此基础上…

JavaScript学习笔记(四)——jQuery插件开发与发布

jQuery插件就是以jQuery库为基础衍生出来的库&#xff0c;jQuery插件的好处是封装功能&#xff0c;提高了代码的复用性&#xff0c;加快了开发速度&#xff0c;现在网络上开源的jQuery插件非常多&#xff0c;随着版本的不停迭代越来越稳定好用&#xff0c;在jQuery官网有许多插…

《树莓派学习指南(基于Linux)》——1.4 将Raspbian烧录到SD卡

本节书摘来异步社区《树莓派学习指南&#xff08;基于Linux&#xff09;》一书中的第1章&#xff0c;第1.4节&#xff0c;作者&#xff1a;【英】Peter Membrey ,【澳】David Hows &#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 1.4 将Raspbian烧录到SD卡 …

python单向链表和双向链表的图示代码说明

图示说明&#xff1a; 单向链表&#xff1a; insert、 remove、 update、pop方法 class Node:def __init__(self, data):self.data dataself.next Nonedef __str__(self):return str(self.data)# 通过单链表构建一个list的结构&#xff1a; 添加 删除 插入 查找 获取长…

AIML知识库数据匹配原理解析

目录&#xff1a;前言&#xff1a;1、AIML系统工作流程2、AIML的核心推理机制3、推理举例4、匹配规则及实践中遇到的一些问题的解释总结&#xff1a; 目录&#xff1a; 前言&#xff1a; 参考&#xff1a;《Alice机理分析与应用研究》 关于AIML库这里就不介绍了&#xff0c…

【Python】模拟面试技术面试题答

一、 python语法 1. 请说一下你对迭代器和生成器的区别&#xff1f; 2. 什么是线程安全&#xff1f; 3. 你所遵循的代码规范是什么&#xff1f;请举例说明其要求&#xff1f; 4. Python中怎么简单的实现列表去重&#xff1f; 5. python 中 yield 的用法…

Win7 U盘安装Ubuntu16.04 双系统

Win7系统下安装Ubuntu系统&#xff0c;主要分为三步&#xff1a; 第1步&#xff1a;制作U盘启动盘 第2步&#xff1a;安装Ubuntu系统 第3步&#xff1a;创建启动系统引导 第1步&#xff1a;制作U盘启动盘 1.下载Ubuntu16.04安装镜像&#xff0c;官网地址&#xff1a;http://www…

Word2VecDoc2Vec总结

转自&#xff1a;http://www.cnblogs.com/maybe2030/p/5427148.html 目录&#xff1a;1、词向量2、Distributed representation词向量表示3、word2vec算法思想4、doc2vec算法思想5、Doc2Vec主要参数详解总结&#xff1a; 目录&#xff1a; 1、词向量 自然语言理解的问题要转…

《游戏视频主播手册》——2.2 哪些人适合做游戏主播

本节书摘来自异步社区《游戏视频主播手册》一书中的第2章&#xff0c;第2.2节&#xff0c;作者 王岩&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.2 哪些人适合做游戏主播 据不完全统计&#xff0c;目前国内有超过26000名活跃的游戏主播。所谓“活跃的…

干货分享!DevExpressv16.2最新版演示示例等你来收!(上)

2019独角兽企业重金招聘Python工程师标准>>> 为解决大家找资源难的问题&#xff0c;EVGET联合DevExpress控件中文网盘点热门的DevExpress资讯、Demo示例、版本升级及下载&#xff0c;以及各种教程推荐等。更多下载及资讯也可以在DevExpress控件中文网中找到&#xf…

一文看懂哈夫曼树与哈夫曼编码

转自&#xff1a;http://www.cnblogs.com/Jezze/archive/2011/12/23/2299884.html 在一般的数据结构的书中&#xff0c;树的那章后面&#xff0c;著者一般都会介绍一下哈夫曼(HUFFMAN)树和哈夫曼编码。哈夫曼编码是哈夫曼树的一个应用。哈夫曼编码应用广泛&#xff0c;如JPEG中…

解决:未能将管道连接到虚拟机: 所有的管道范例都在使用中。

虚拟机无端出现: VMware Workstation 无法连接到虚拟机。请确保您有权限运行该程序、访问改程序使用的所有目录以及访问所有临时文件目录。未能将管道连接到虚拟机: 所有的管道范例都在使用中。 原因&#xff1a;Ubuntu开机慢到开不开&#xff0c;我就在任务管理器强制结束了…

CCF推荐各种国际学术会议和期刊目录

这是中国计算机学会推荐国际学术会议和期刊目录2015年版本的内容&#xff0c; 主要罗列了国际上计算机相关的各个方向的顶级学术会议和期刊目录&#xff08;包含A、B、C三个等级&#xff09;。 包含的方向有&#xff1a; 计算机体系结构/并行与分布计算/存储系统计算机网络网络…

第四次作业类测试代码+036+吴心怡

一、类图 二、代码 package application; public class Commission { /* * hp&#xff1a;耳机 80元 mpc&#xff1a;手机壳 10元 cpsp&#xff1a;手机贴膜 8元 */ public float calculate(String line) { int hp 0, mpc 0, cpsp 0; String[] input null; float money 0;…

LSI/LSA算法原理与实践Demo

目录&#xff1a;1、使用场景2、优缺点3、算法原理3.1、传统向量空间模型的缺陷3.2、Latent Semantic Analysis (Latent Semantic Indexing)3.3、算法实例 4、文档相似度的计算5、对应的实践Demo 目录&#xff1a; 1、使用场景 文本挖掘中&#xff0c;主题模型。聚类算法关注…

Linux学习134 Unit 8

Unit8 ldap网络帐号1.ldap是什么ldap目录服务认证&#xff0c;和windows活动目录类似&#xff0c;就是记录数据的一种方式2.ldap客户端所须软件yum sssd krb5-workstation -y3.如何开启ldap用户认证authconfig-tui┌────────────────┤ Authentication Configu…

FastText原理总结

目录&#xff1a;1、应用场景2、优缺点3、FastText的原理4、FastText词向量与word2vec对比 目录&#xff1a; 1、应用场景 fastText是一种Facebook AI Research在16年开源的一个文本分类器。 其特点就是fast。相对于其它文本分类模型&#xff0c;如SVM&#xff0c;Logistic …

解决 :sudo:/etc/sudoers 可被任何人写

问题&#xff1a; sudo:sudo /etc/sudoers is world writable sudo:no valid sudoers sources found ,quitting sudo:unable to initialize policy plugin 解决方案&#xff1a; 方法一: 1.开机按shift或esc进入ubantu高级模式 再进行recovery模式 2.选择root命令行模式 3.…

Doc2Bow简介与实践Demo

Doc2Bow是Gensim中封装的一个方法&#xff0c;主要用于实现Bow模型&#xff0c;下面主要介绍下Bow模型。 1、BoW模型原理 Bag-of-words model (BoW model) 最早出现在自然语言处理&#xff08;Natural Language Processing&#xff09;和信息检索&#xff08;Information Ret…