简单理解头插法(Python实现)

​ 最近一段时间刷leetcode遇到一个叫“两数相加”的题目,然后有一个步骤需要构建一个单链表(需要头插法或者尾插法),忘记算法怎么写了,然后用别人的轮子把题目过了,再来学习学习头插法。

一、数据结构

class node(object):def __init__(self, data=None, next=None):self.data = dataself.next = next

链表的数据结构是由数据域和指针域构成的,c语言用结构体,面向对象语言用类就可以了。一个类里可以定义存放数据的data和存放下一节点的next。

二、算法图解

头插法的过程如上图所示,

  1. 先创建一个head结点
  2. 再把新的节点装在头节点后面,这样就完成了第一步的操作了。
  3. 关键是第2个节点,以及以后的节点是怎么实现插入的呢?这个相对于第一个就复杂一下,也是推出头插法公式套路的关键。先将上一个节点(111)装在新节点(222)的next里,然后把新节点(222)装在head的next里。

总结,头插法存储数据的顺序和输入顺序相反。输入111、222。输出222,111。head这个头节点有什么用呢,其实他像一个中间变量,用来存储你要寄放的值(最新节点都会存在head的next域里)。也像一个迷宫的入口(你遍历单链表的入口就是head)。

三、头插法核心代码推导

推导代码会用到下面2个节点对象

head = node() #这个是头节点
new_node = node(111) #这个代表新节点

1.首先创建一个头节点

head = node()

2.接下来是头插法的关键代码的推导过程=》把新节点放在head后面(也就是把head的next指向新节点)第二到第三步是一个错误到正确的演变过程

new_node = node(111)
head.next = new_node

3.按照步骤2的思路,我们继续让head的next域指向新节点,你会发现之前的数据丢失了,所以在指向新节点之前你是不是应该对原来next域做一个保存

这样正好对应我们的算法图解的第三步

new_node = node(222)
new_node.next = head.next #先保存我们next域
head.next = new_node #让head指向新节点,新节点的next也正好存放了之前的数据

总结头插法的核心代码

new_node.next = head.next
head.next = new_node

四、完成代码

class node(object):def __init__(self, data=None, next=None):self.data = dataself.next = nextdef create_single_linkList():head = node()value = input("请输入值, #表示退出")while value != '#':new_node = node(value)new_node.next = head.nexthead.next = new_nodevalue = input("请输入值, #表示退出")return headdef print_single_linkList(head):if head.data is None:  # 头节点不存数据,所以去掉他head = head.nextwhile head:print(head.data)head = head.nextprint_single_linkList(create_single_linkList())

五、总结

虽然头插法很简单(我一朋友说的,哈哈哈),但是看了一些书,很多博客,一开始就把正确的答案给我,把正确的思路给我,我就是不理解。相反用错误的示范,推出正确的结果,这才是探索科学吧,失败乃成功之母也是这个理。

简单理解头插法(Python实现)相关推荐

  1. APP自动化简单理解(在python中实现简单的app自动化框架)

    一.app自动化环境搭建 1.安装jdk及配置jdk的环境变量 app底层是c语言,应用层是java,所以需要jdk 2.安装SDK,配置android SDK环境 3.安装模拟器 4.下载安装App ...

  2. 链表的两种创建方法——头插法与尾插法

    链表创建的两种方法 引言 ​ 首先讲述了我自己在动态实现数据结构的时候遇到的大坑结构体指针问题,随后就是头插法和尾插法的介绍. 结构体指针 引言 ​ 首先需要讲述的是一个让我改了一天半的bug.实际上 ...

  3. python语言的计算生态规模有多大_【单选题】Python 语言的一个重要特点是它有较多的计算生态,简单理解为第三方提供的可用编程模块 / 函数库 / 组件,这个规模有多大?...

    [单选题]Python 语言的一个重要特点是它有较多的计算生态,简单理解为第三方提供的可用编程模块 / 函数库 / 组件,这个规模有多大? 更多相关问题 [问答题,简答题] 顾客关系管理系统如何给企业 ...

  4. 主成分分析法(PCA)的理解(附python代码案例)

    目录 一.PCA简介 二.举个例子 三.计算过程(公式) 3.0 题干假设 3.1 标准化 3.2 计算协方差矩阵 3.3 计算特征值和特征值向量 3.3 多重共线性检验(可跳过) 3.4 适合性检验 ...

  5. python yield的简单理解

    2019独角兽企业重金招聘Python工程师标准>>> yield是个生成器,它可以使一个方法变成可迭代的方法,每次迭代返回yield后面的值 简单理解: >>>d ...

  6. php和python的多线程,Python多线程以及线程锁简单理解(代码)

    本篇文章给大家带来的内容是关于Python多线程以及线程锁简单理解(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 多线程threading 模块创建线程创建自己的线程类线程通 ...

  7. 人工智能:深度学习算法及应用——简单理解CNN卷积神经网络并python实现(带源码)

    深度学习算法及应用 一. 实验目的 二. 实验要求 三. 实验的硬件.软件平台 四. 实验原理 1.1. 深度学习概述 1.2. 深度学习的常见结构 1.3. 卷积神经网络(CNN) **卷积** * ...

  8. 单链表常见题目(头插法理解)

    我们用上一篇中的代码接着实现,上一篇点击单链表的简单介绍和实现增删改查 1 求有效节点的个数 /** 求单链表有效长度(如果是带头结点的链表,需求不统计头节点)*/public int getLeng ...

  9. 几句话搞懂朴素贝叶斯法(简单理解和应用)

    几句话搞懂朴素贝叶斯法(简单理解和应用) 适合如我这般完全忘记数学知识的小白,大佬可绕行 贝叶斯定理 先验概率 条件概率 极大似然估计 贝叶斯估计 公式解读:贝叶斯公式.极大似然估计.贝叶斯公式变形 ...

最新文章

  1. 微信开放平台,微信登陆第三方网站 提示redirect_uri 参数错误
  2. 分块-洛谷P3203 [HNOI2010]BOUNCE 弹飞绵羊
  3. PHP生成登录图片验证码
  4. redis 缓存 淘汰
  5. 异常处理汇总-运维系列
  6. 如何基于链表实现 LRU 缓存淘汰算法?
  7. Lua的协程和协程库详解
  8. Python批量下载XKCD漫画只需20行命令!
  9. OutMan——C语言中的冒泡排序、选择排序、折半查找以及指针的介绍
  10. OpenHarmony hdc_std无反应的解决办法
  11. python实现excel单元格合并_python进行excel单元格合并逆操作
  12. Linux服务器程序规范化
  13. oracle中三元运算符,三目运算符简介 - ZICK_ZEON的个人空间 - OSCHINA - 中文开源技术交流社区...
  14. java图片改变分辨率并保存
  15. 微信服务器是否记录视频信息,微信视频号有访客记录吗 微信视频号可以查看浏览记录吗...
  16. oracle 视图、索引、序列、同义词
  17. eclipse java1.8_不同版本Eclipse对JDK版本要求
  18. 国内外优秀的垂直搜索引擎
  19. Mysql 中使用UUID做为主键,去掉- 横线
  20. 把表中名为'诺基亚xxxx'的商品,改为'HTCxxxx',

热门文章

  1. 喜大普奔,华为在海外市场再破局,与过亿人口的孟加拉达成合作
  2. O-2-2 赚钱宝开启Samba服务
  3. 深度学习系列(一)简介、线性回归与成本函数
  4. 正样本(positive example )和负样本(negative example),easy example 和 example
  5. CEF-81.3.10支持Flash自动播放代码修改
  6. python selenium对象怎么序列化_Python Selenium如何操作Cookies
  7. Java8 Semaphore与Exchanger 源码解析
  8. Win10如何安装Microsoft Print to pdf打印机
  9. odoo 12 是什么
  10. python判断字符串相等_python字符串如何判断相等