简单理解头插法(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. 01 使用AFN3 0上传图片时间慢的问题
  2. QIIME 2用户文档. 9数据导出Exporting data(2018.11)
  3. A13在c语言中是合法变量吗,C语言中局部变量和全局变量等在内存中的存放位置.doc-资源下载在线文库www.lddoc.cn...
  4. matlab 比较日期,[转载][Matlab]关于时间的函数的不完全总结
  5. 灵活、高效、智慧,宁畅发布新品及“智定+”战略
  6. Golang笔记——json介绍
  7. MySQL数据库中的Date,DateTime,int,TimeStamp和Time类型的对比
  8. 半个月自学入行软件测试,也许你就是下一个测试总监
  9. linux环境变量中无cc,Linux环境变量
  10. SQL Server用户权限详解
  11. 漂亮的不像实力派--锤子新品“坚果手机”发布会
  12. 微信点餐系统技术总结
  13. 锂电池的充电原理以及快充原理
  14. 智能时代悄然到来刷脸支付逐渐成为潮流
  15. Jenkins系列之——第二章 Jenkins中Maven和JDK配置
  16. 海盗分赃问题-----简化问题,分而治之
  17. 并行分布式计算 并行机系统互联网络
  18. NOIP复习篇———动态规划
  19. 指针变量的星号是靠近变量名还是靠近类型
  20. HEARTS, CLUBS, DIAMONDS, SPADES: PLAYERS WHO SUIT MUDS

热门文章

  1. Thymeleaf基础
  2. 【学习记录贴】04:域名购买和备案
  3. Mac 上 Qt6 加速下载官方步骤,无需 Fiddler、Nginx 或配置资料档案库
  4. keil在线仿真STM32,需要点三次全速运行才能跑起来
  5. 0、小白入门ESP8266导读
  6. 京东新通路2020年将新增1万家“六统一”门店
  7. php社区果蔬网站 毕业设计-附源码211548
  8. vue系列之----- px转rem配置
  9. Week--My batis
  10. 在app端手写签名并保存下来(以文件形式或者是base64编码)