看动画学算法之:linkedList
简介
linkedList应该是一种非常非常简单的数据结构了。节点一个一个的连接起来,就成了linkedList。今天我们使用动画的方法一起来看看linkedList是怎么插入和删除的。
linkedList的构建
linkedList是由一个一个的节点构成的。而每个节点只需要存储要保存的数据和下一个节点的引用即可。
linkedList本身需要一个head节点,所以我们的linkedList可以这样构建:
public class LinkedList { Node head; // head 节点 //Node表示的是Linked list中的节点,包含一个data数据和下一个节点的引用 class Node { int data; Node next; //Node的构造函数 Node(int d) { data = d; } } }
linkedList的操作
先看一下linkedList怎么插入数据,插入数据有三种方式,头部插入,尾部插入,中间插入。
头部插入
先看一个头部插入的例子:
头部插入的逻辑是什么呢?
新插入的节点作为head节点,然后将原来的head节点指向当前head节点的next引用即可。
//插入到linkedList的头部 public void push(int newData) { //构建要插入的节点 Node newNode = new Node(newData); //新节点的next指向现在的head节点 newNode.next = head; //现有的head节点指向新的节点 head = newNode; }
尾部插入
再看一下尾部插入的例子:
插入的逻辑是什么呢?
找到最后一个节点,然后将最后一个节点的next指向新插入的节点。
//新节点插入到list最后面 public void append(int newData) { //创建新节点 Node newNode = new Node(newData); //如果list是空,则新节点作为head节点 if (head == null) { head = newNode; return; } newNode.next = null; //找到最后一个节点 Node last = head; while (last.next != null) { last = last.next; } //插入 last.next = newNode; return; }
中间插入
再看一下中间插入的例子:
这个例子中,我们在第三个节点的位置插入了一个93。
插入逻辑就是先找到第二个节点,将第二个节点的next指向新节点,然后将新节点的next指向原先的第三个节点。
看下java代码如何实现:
//插入在第几个元素之后 public void insertAfter(int index, int newData) { Node prevNode = head; for (int i = 1; i < index; i++) { if (prevNode == null) { System.out.println("输入的index有误,请重新输入"); return; } prevNode = prevNode.next; } //创建新的节点 Node newNode = new Node(newData); //新节点的next指向prevNode的下一个节点 newNode.next = prevNode.next; //将新节点插入在prevNode之后 prevNode.next = newNode; }
删除节点
再看一下怎么删除某个位置的节点:
上面的例子中,我们要删除第5个节点。
删除的逻辑就是找到第4个节点和第6个节点。然后将第四个节点的next指向第6个节点即可。
看下相应的java代码如下:
//删除特定位置的节点 void deleteNode(int index) { // 如果是空的,直接返回 if (head == null) return; // head节点 Node temp = head; // 如果是删除head节点 if (index == 1) { head = temp.next; return; } // 找到要删除节点的前一个节点 for (int i=1; temp!=null && i<index-1; i++) temp = temp.next; // 如果超出范围 if (temp == null || temp.next == null) return; // temp->next 是要删除的节点,删除节点 Node next = temp.next.next; temp.next = next; }
本文的代码地址:
本文收录于 http://www.flydean.com/algorithm-linked-list/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
java安全编码指南之:方法编写指南
简介 java程序的逻辑是由一个个的方法组成的,而在编写方法的过程中,我们也需要遵守一定的安全规则,比如方法的参数进行校验,不要在assert中添加业务逻辑,不要使用废弃或者过期的方法,做安全检查的方法一定要设置为private等。 今天我们再来深入的探讨一下,java方法的编写过程中还有哪些要注意的地方。 不要在构造函数中调用可以被重写的方法 一般来说在构造函数中只能调用static,final或者private的方法。为什么呢? 如果父类在执行构造函数的时候调用了一个可以被重写的方法,那么在该方法中可能会使用到未初始化的数据,从而导致运行时异常或者意外结束。 另外,还可能到方法获取到未初始化完毕的实例,从而导致数据不一致性。 举个例子,我们定义了一个Person的父类: public class Person { public void printValue(){ System.out.println("this is person!"); } public Person(){ printValue(); } } 然后定义了一个Boy的子类,但是在Boy子类中,重新了父类的prin...
- 下一篇
如何生成 Flink 作业的交互式火焰图?
作者:田志声 前言 Flink 是目前最流行的大数据及流式计算框架之一,用户可以使用 Java/Scala/Python 的 DataStream 接口或者标准 SQL 语言来快速实现一个分布式高可用的流式应用,通过内部的 Java JIT、off-heap 内存管理等技术优化性能,并且有完整的 Source、Sink、WebUI、Metrics 等功能集成,让 Flink 几乎成为了流式计算的事实标准。 但是当处理海量数据的时候,很容易出现各种异常和性能瓶颈,这时我们需要优化系统性能时,常常需要分析程序运行行为和性能瓶颈。Profiling 技术是一种在应用运行时收集程序相关信息的动态分析手段,常用的 JVM Profiler 可以从多个方面对程序进行动态分析,如 CPU、Memory、Thread、Classes、GC 等,其中 CPU Profiling 的应用最为广泛。CPU Profiling 经常被用于分析代码的执行热点,如“哪个方法占用 CPU 的执行时间最长”、“每个方法占用 CPU 的比例是多少”等等,通过 CPU Profiling 得到上述相关信息后,研发人员就可...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境