看动画学算法之: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/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
看动画学算法之:linkedList的更多相关文章
- 看动画学算法之:排序-count排序
目录 简介 count排序的例子 count排序的java实现 count排序的第二种方法 count排序的时间复杂度 简介 今天我们介绍一种不需要作比较就能排序的算法:count排序. count排 ...
- 看动画学算法之:doublyLinkedList
目录 简介 doublyLinkedList的构建 doublyLinkedList的操作 头部插入 尾部插入 插入给定的位置 删除指定位置的节点 简介 今天我们来学习一下复杂一点的LinkedLis ...
- 看动画学算法之:栈stack
目录 简介 栈的构成 栈的实现 使用数组来实现栈 使用动态数组来实现栈 使用链表来实现 简介 栈应该是一种非常简单并且非常有用的数据结构了.栈的特点就是先进后出FILO或者后进先出LIFO. 实际上很 ...
- 看动画学算法之:平衡二叉搜索树AVL Tree
目录 简介 AVL的特性 AVL的构建 AVL的搜索 AVL的插入 AVL的删除 简介 平衡二叉搜索树是一种特殊的二叉搜索树.为什么会有平衡二叉搜索树呢? 考虑一下二叉搜索树的特殊情况,如果一个二叉搜 ...
- 看动画学算法之:队列queue
目录 简介 队列的实现 队列的数组实现 队列的动态数组实现 队列的链表实现 队列的时间复杂度 简介 队列Queue是一个非常常见的数据结构,所谓队列就是先进先出的序列结构. 想象一下我们日常的排队买票 ...
- 看动画学算法之:hashtable
目录 简介 散列表的关键概念 数组和散列表 数组的问题 hash的问题 线性探测 二次探测 双倍散列 分离链接 rehash 简介 java中和hash相关并且常用的有两个类hashTable和has ...
- 看动画学算法之:二叉搜索树BST
目录 简介 BST的基本性质 BST的构建 BST的搜索 BST的插入 BST的删除 简介 树是类似于链表的数据结构,和链表的线性结构不同的是,树是具有层次结构的非线性的数据结构. 树是由很多个节点组 ...
- 看动画学算法之:双向队列dequeue
目录 简介 双向队列的实现 双向队列的数组实现 双向队列的动态数组实现 双向队列的链表实现 双向链表的时间复杂度 简介 dequeue指的是双向队列,可以分别从队列的头部插入和获取数据,也可以从队列的 ...
- 跟vczh看实例学编译原理——一:Tinymoe的设计哲学
自从<序>胡扯了快一个月之后,终于迎来了正片.之所以系列文章叫<看实例学编译原理>,是因为整个系列会通过带大家一步一步实现Tinymoe的过程,来介绍编译原理的一些知识点. 但 ...
随机推荐
- 再爆安全漏洞,这次轮到Jackson了,竟由阿里云上报
冤冤相报何时了,得饶人处且饶人.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[ ...
- 非旋Treap——维护数列
https://www.luogu.org/problemnew/show/P3391 知识点:1.split:1.拆数值 2.拆排名 2.merge 3.截取l - r这个区间,先截l - 1出来, ...
- centos开放指定端口
1.开启防火墙 systemctl start firewalld 2.开放指定端口 firewall-cmd --zone=public --add-port=1935/tcp ...
- hadoop不能互相访问和linux防火墙守护进程
前言——作为装过几次集群的菜鸟,对于hadoop集群的安装还是比较有心得的:只要配置文件够好,集群配置就非常容易,否则也容易出现莫名其妙的问题!总结了一份3台机器搭建较完好的集群的一份配置文件. 在我 ...
- leetcode刷题-58最后一个单词
题目 给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度.如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词. 如果不存在最后一个单词,请返回 0 . 说明:一 ...
- Mybatis-使用注解开发
使用注解开发 [toc] 1. 面向接口编程 大家之前都学过面向对象编程,也学习过接口,但在真正的开发中,很多时候我们会选择面向接口编程 根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 ...
- python应用 处理excel数据
实现功能 excel表格中有4列数,分别为RMF计算得到的 β,γ,势能面及组态,需要挑选出相同 β 值下势能面最低时的组态.为了减小数据量,先将 β 值保留两位小数. 代码 import xlrd ...
- mobiscroll
https://docs.mobiscroll.com/3-2-3/jquery/calendar#!options
- Fliptile(POJ 3279)
原题如下: Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16494 Accepted: 6025 D ...
- oracle之WHERE子句中常用的运算符
WHERE子句中常用的运算符 4.1 运算符及优先级: 算数运算符*,/,+,-, 逻辑运算符not, and ,or 比较运算符 单行比较运算 =,>, >=,<,<=, & ...