目录

《学习笔记》--温故而知新

一、链表是什么?

二、单向链表

1.如何创建链表的结构

2.实现单链表的添加节点(尾部添加)

3.指定位置插入节点(已解决头节点插入)

4.删除指定位置的节点(头结点也可删除)

5.链表的反转(非递归版)

6.链表的查询

7.链表的修改

总结



《学习笔记》--温故而知新

从基础开始复习以前学过的 Java 基础,再一次的学习每天的学习都会对 Java 基础有着比以前更加深刻的理解,也会回顾起已经忘记了的Java基础的知识点。

一、链表是什么?

在我的认知里面,链表就是一根链子,就好比一个个的铁圈中间用铁丝连成了一个链子。链表也就像这样,它的每一个节点就好比一个铁圈,他们是非连续的,但是他们又能找到下一个节点在哪里。

官方一点的解释就是: 链表是一种 物理存储结构上非连续 、非顺序的存储结构,数据元素的 逻辑顺序 是通过链表中的 指针链 接 次序实现的 。
这是较为书面的解释,这里我画个图解释一下:

二、单向链表

1.如何创建链表的结构

代码如下(示例):

val 用来存储节点的值,next 用来存储下一个节点的地址值。

class oneListNode {int val;oneListNode next;oneListNode(){}oneListNode(int val){this.val = val;}
}

2.实现单链表的添加节点(尾部添加)

代码如下(示例):

//添加节点(尾部添加)public static oneListNode found(oneListNode head,int val){oneListNode node = new oneListNode(val);if (head == null){head = node;return head;}oneListNode tail = head;while ( tail.next != null){tail = tail.next;}tail.next = node;N++;return head;}

这里面的思想就是:先要进行头结点的判断,当头结点为空的时候,我们需要创建一个新的节点来当我们的头结点然后将其返回去。接下来也就是第二次添加节点【这里要注意我们要一直使用一个节点对象,途中要是有创建新的节点对象的话,会发生一点小错误这里面也是我代码书写不规范所导致的)】,所以这时候我们的头结点对象就不为空了。这时候我们就要用一个临时的指针【也可以看成指针,虽然Java里面没有指针,但是指针的思想是不可能从数据结构中剔除的】,用这个指针【此时的指针就是指向我们的链表头,也就是此时的临时指针就是我们的头结点】去循环遍历找到我这个单列表的最后一个位置,然后往我这个最后的位置添加我们新的节点。

3.指定位置插入节点(已解决头节点插入)

插入的话有俩种思想:我的代码使用的是第一种思想

  • 第一种:就是在节点5的位置插入,我要把节点5的节点变成我刚刚插入节点。
  • 第二种:就是在节点5的位置插入,我要把节点5的节点之后的节点变成我刚刚插入节点。
//插入节点  指定位置插入public static oneListNode insert(oneListNode head,int index,int val){if (index <= 0){System.out.println("输入不合法");return null;}if (index > N){System.out.println("添加位置超过链表长度,已在最后位置添加");oneListNode found = found(head, val);return found;}oneListNode pre = head;oneListNode tail = null;//头结点位置插入if (index == 1){oneListNode node = new oneListNode(val);node.next = pre;head = node;return head;}for (int i = 1; i < index - 1; i++) {pre = pre.next;}tail = pre.next;oneListNode node = new oneListNode(val);pre.next = node;node.next = tail;N++;return head;}

节点插入的话无非就是三种情况:

第一种:插入的位置大于链表的长度【俩种解决方法:1.报错返回null。2.直接插入到最后一个位置。】,如果小于0的话就直接报错返回null

第二种:在头结点插入,我的新节点的下一个指向我原来的头结点,然后我就让我新的节点变成我的头结点。 这样的话就完成了我们的头结点插入。

第三种情况:在链表中间插入。首先我们要找到我们要插入位置的前一个节点,并记录下当前节点的下一个节点。让我的前一个节点的下一个指向我要插入的新节点,新节点的下一个指向我刚刚保存的当前节点的下一个节点。

4.删除指定位置的节点(头结点也可删除)

 public static oneListNode deleted(oneListNode head,int index){if (index > N || index <= 0){return null;}oneListNode pre = head;if (index == 1){System.out.println("被删除的节点是:"+pre.val);pre = pre.next;head = pre;return head;}for (int i = 1; i < index - 1; i++) {pre = pre.next;}oneListNode tail = pre.next;pre.next = tail.next;N--;System.out.println("被删除的节点是:"+tail.val);return head;}

我觉得删除节点要容易于插入节点删除节点就是直接把我删除的节点的前一个节点的指向直接指向我当前要删除节点的下一个节点。这样的话就没有人指向我当前这个节点了所以就相当于节点被删除了。头结点的删除就是,把头结点的下一个节点赋值成为头结点,这样的话不就相当于没有头结点了吗。

5.链表的反转(非递归版)

主要是递归的我不会,嘿嘿。

// 链表反转public static oneListNode reversal(oneListNode head){oneListNode pre = null;oneListNode tail = null;while (head != null){tail = head.next;head.next = pre;pre = head;head = tail;}return pre;}

这个的思想也简单,就是用来个临时的指针来存放当前节点和下一个节点,将俩个节点之间的连接断开然后在重新指向(这次的指向就是和原来的相反了),然后就是将头结点后移动,让后一个节点成为头结点。如此循环执行到链表完全反转。

6.链表的查询

我感觉比较鸡肋,链表的优势就是在于插入和删除的效率高,查找的效率极低。

public static Integer search(oneListNode head,Integer index){if (head==null){return -1;}else if (head.next == null){return head.val;}oneListNode node = head;Integer newIndex = 1;while (newIndex < index && node != null){node = node.next;newIndex++;}return node.val;}

这里的代码就不用多解释了,就是遍历找到节点,然后返回节点的值。

7.链表的修改

public static void revamp(oneListNode head,Integer index,Integer newVal){if (head==null){return ;}else if (head.next == null){head.val = newVal;}oneListNode node = head;Integer newIndex = 1;while (newIndex < index && node != null){node = node.next;newIndex++;}node.val = newVal;}

就是在查询的基础上的一些小小的修改,查询是返回当前节点的值,修改不就是将该节点的值修改成要改变成的值。

三、完整代码示例

public class oneList {public static int N = 0;public static void main(String[] args) {oneListNode node = null;for (int i = 1; i <= 10; i++) {node = found(node, i);}
//        revamp(node,5,100);
//        System.out.println(search(node, 5));
//        node = deleted(node,1);
//        System.out.println(node.val);node = insert(node, 11, 100);System.out.println("该列表经过操作之后为:");while (node != null){System.out.print(node.val+",");node = node.next;}//        insert(node,0,100);
//        System.out.println(length());
////        oneListNode reversal = reversal(node);
//        while (reversal != null){
//            System.out.println(reversal.val);
//            reversal = reversal.next;
//        }}public static oneListNode deleted(oneListNode head,int index){if (index > N || index <= 0){return null;}oneListNode pre = head;if (index == 1){System.out.println("被删除的节点是:"+pre.val);pre = pre.next;head = pre;return head;}for (int i = 1; i < index - 1; i++) {pre = pre.next;}oneListNode tail = pre.next;pre.next = tail.next;N--;System.out.println("被删除的节点是:"+tail.val);return head;}//插入节点  指定位置插入public static oneListNode insert(oneListNode head,int index,int val){if (index <= 0){System.out.println("输入不合法");return null;}if (index > N){System.out.println("添加位置超过链表长度,已在最后位置添加");oneListNode found = found(head, val);return found;}oneListNode pre = head;oneListNode tail = null;//头结点位置插入if (index == 1){oneListNode node = new oneListNode(val);node.next = pre;head = node;return head;}for (int i = 1; i < index - 1; i++) {pre = pre.next;}tail = pre.next;oneListNode node = new oneListNode(val);pre.next = node;node.next = tail;N++;return head;}// 返回链表长度public static int length(){return N;}//添加节点(尾部添加)public static oneListNode found(oneListNode head,int val){oneListNode node = new oneListNode(val);if (head == null){head = node;return head;}oneListNode tail = head;while ( tail.next != null){tail = tail.next;}tail.next = node;N++;return head;}// 链表反转public static oneListNode reversal(oneListNode head){oneListNode pre = null;oneListNode tail = null;while (head != null){tail = head.next;head.next = pre;pre = head;head = tail;}return pre;}public static Integer search(oneListNode head,Integer index){if (head==null){return -1;}else if (head.next == null){return head.val;}oneListNode node = head;Integer newIndex = 1;while (newIndex < index && node != null){node = node.next;newIndex++;}return node.val;}public static void revamp(oneListNode head,Integer index,Integer newVal){if (head==null){return ;}else if (head.next == null){head.val = newVal;}oneListNode node = head;Integer newIndex = 1;while (newIndex < index && node != null){node = node.next;newIndex++;}node.val = newVal;}
}class oneListNode {int val;oneListNode next;oneListNode(){}oneListNode(int val){this.val = val;}
}

总结

单链表是数据结构中较为重要的部分,同样也是在历年的笔试中频频出现。所有理解并能熟练的书写出单列表的代码,其中的增加,插入,删除这些黛米是必须要能熟练的书写。其他的实际上当你会了增加,插入,删除这三个以后都是小Case。最好是能够手写出来单列表及其重要的方法。大家千万不要学我这样写,最好把方法也都写在你自定义好的节点类里面!!!(后悔莫及,又懒得重写了)

祝大家早日理解单链表,也欢迎大家给我提出意见。

明天开始双链表!

《学习笔记》------温故而知新相关推荐

  1. JavaScript学习笔记——JS中的变量复制、参数传递和作用域链

    今天在看书的过程中,又发现了自己目前对Javascript存在的一个知识模糊点:JS的作用域链,所以就通过查资料看书对作用域链相关的内容进行了学习.今天学习笔记主要有这样几个关键字:变量.参数传递.执 ...

  2. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC

    OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...

  3. 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

    来源:http://dsqiu.iteye.com/blog/1669614 之前一直对C++内部的原理的完全空白,然后找到<Inside The C++ Object Model>这本书 ...

  4. 《如何高效阅读一本书》学习笔记

    2023.04.21 <如何高效阅读一本书 / 彭清清著>学习笔记 <如何高效阅读一本书>学习笔记 〇.磨刀不误砍柴工--阅读前先明确以下几点 1.我们为什么要阅读--目的性 ...

  5. 游戏黑客圣经GHB1学习笔记 part1(1-5)

    游戏黑客圣经(Game Hacking Bible1) 我在这里记录我所有课程的学习笔记,包括一些小技巧以及源码,俗话说好记性不如烂笔头,写在这里,用于温故而知新. 前言 学习游戏黑客的必备条件 智力 ...

  6. Java学习笔记系列-入门篇-计算机基础

    Java学习笔记 Java学习笔记是一个持续更新的系列,工作多年,抽个空对自身知识做一个梳理和总结归纳,温故而知新,同时也希望能帮助到更多正在学习Java 的同学们. 本系列目录: 入门篇 计算机基础 ...

  7. SiamFC论文学习笔记

    SiamFC论文学习笔记 引言 相似度学习 网络结构 损失函数的定义 优化与训练方案 总结 引言 这是我写下的第一篇博文,主要目的是提升学习自己的主动性,对自己学到的知识进行及时总结反思,也便于在后续 ...

  8. 数据库学习笔记第三弹——MySQL常用的图形化管理辅助工具及相关问题(图文详解2022))

    数据库学习笔记第三弹--MySQL常用的图形化管理辅助工具(图文详解2022) 文章目录 数据库学习笔记第三弹--MySQL常用的图形化管理辅助工具(图文详解2022) 1.MySQL常用的图形化管理 ...

  9. 数据库学习笔记第一弹——MySQL8.0和MySQL5.7的下载、安装与配置(图文详解步骤2022)

    数据库学习笔记第一弹--MySQL8.0和MySQL5.7的下载.安装与配置(图文详解步骤2022) 文章目录 数据库学习笔记第一弹--MySQL8.0和MySQL5.7的下载.安装与配置(图文详解步 ...

最新文章

  1. docker与k8s面试题基础
  2. js html 追加span内容,使用JavaScript显示SPAN的内容
  3. 深入浅出地解读Python迭代器和生成器
  4. 梳理各算法基础应用及场景
  5. Java8 CountDownLatch 源码分析
  6. CodeForces - 1284B New Year and Ascent Sequence(乱搞)
  7. centos65安装RabbitMQ3.6.5
  8. php mysql无限_php+mysql实现无限分类实例详解
  9. Python黑帽编程2.7 异常处理
  10. 质数 素数 合数 因子
  11. 如何查看远程端口是否打开
  12. mysql获取当前日期的前一天_MySql取得日期(前一天、某一天)
  13. 双11之战:被激化的酒类电商出击,看1919新打法
  14. EMAC和PHY层之间的关系以及在通信架构划分情况
  15. 小飞鱼平台介绍——小飞鱼开发者服务平台业务介绍
  16. 开发你自己的Android 授权管理器 (AccountManager的使用以及应用场景)
  17. 欧拉法及其他改进方法——Matlab实现
  18. 慕司板V1注意事项及问题汇总
  19. vue中使用excel导出,详细步骤
  20. 损失率下降,但是准确率却提升慢或准确率结果不高

热门文章

  1. OGC标准介绍 12
  2. 百度联盟对外宣布,原个人联盟业务取消
  3. ZBrush——纯小白入门篇(二)
  4. EPLAN P8导线颜色的设置
  5. 图片(txt等)实现默认下载而不是浏览器默认打开(Java版)
  6. 2901-View-Gallery
  7. 印象笔记一直弹窗提示授权升级账户怎么办?
  8. 数学常用希腊字母念法(附字母表)
  9. HTML5+CSS+JavaScript实现捉虫小游戏设计和实现【有密集恐惧症的别玩哟】
  10. Matter理论介绍-通用-1-05:桥接设备-发现与配置流程