这篇文章主要讲解了通过java实现单链表的操作,一般我们开始学习链表的时候,都是使用C语言,C语言中我们可以通过结构体来定义节点,但是在Java中,我们没有结构体,我们使用的是通过类来定义我们所需要的节点,链表。

下面我主要说明5个操作:增加元素(两种),查找元素,更新元素,删除元素,遍历单链表中的元素。

第一部分.单链表的介绍

在我们平时的使用中,通过数组我们可以快速的存储元素,链表也是和数组一样可以用来存储元素,但是链表在一些方面比数组的效率更高,在查找元素的时候我们通常用数组来存储,但是当我们插入和删除元素的时候,通常我们使用链表来进行操作。链表我们通常定义有两个域:数据域和指针域。数据域存储的是我们要存储的数据,指针域存储的是我们要指向下一个地址的指针。

单链表的存储方式:单链表的存储方式如下:

单链表的每个元素的存储空间不是连续的,我们只能通过第一个数据的指针找到下一个元素的位置,之后才能进行访问。这里面在链表中我们通常加一个head(头指针),这个头指针可以方便我们对链表头元素的插入和删除,它仅仅代表一个标志,里面可以写上链表的长度等等。

带表头的单链表的逻辑示意图如下:

第二部分.单链表的操作

节点的创建:

class HeroNode{
public int no;
public String name;
public String nickname;
public HeroNode next; public HeroNode(int no,String name,String nickname){
this.no = no;
this.name = name;
this.nickname = nickname;
}
public String toString(){
return "HeroNode[no="+no+"\t"+"name="+name+"\t"+"nickname="+nickname+"]";
}
}

单链表的创建(我会在这里面加入各种操作,通过注释讲解)

class LinkedList{
//创建头结点,将第一个头结点定义成私有的。
private HeroNode head = new HeroNode(0,"","");
//返回头结点,这里面直接调用get,set即可。
public HeroNode getHead() {
return head;
} //在链表的最后添加元素
public void add(HeroNode heronode){
//找一个辅助变量temp来遍历
HeroNode temp = head;
while(true){
if(temp.next == null){
break;
}
//这个地方要注意,每次都要往后移一个单位,否则就是死循环了。
temp = temp.next;
}
temp.next = heronode; }
//在链表中按照编号的顺序添加
public void addOrderBy(HeroNode heronode){
HeroNode temp = head;
boolean flag = false;
while(true){
if(temp.next == null){
break;
}
if(heronode.no<temp.next.no){
break;
}else if(heronode.no == temp.next.no){
flag = true;
break;
}
temp = temp.next;
} if(flag){
System.out.println("编号已经存在,不能添加");
return;
}else{
//在链表中插入元素的步骤,重点代码!!!
heronode.next = temp.next;
temp.next = heronode;
} }
//在链表中根据编号修改元素,相当于就是查找
public void update(int no){
HeroNode temp = head.next;
boolean flag = false;
while(true){
if(temp.next == null){
break;
}
if(temp.no == no){
flag = true;
break;
}
temp = temp.next;
}
if(flag){
temp.name = "xiao";
temp.nickname = "xiao";
}else{
System.out.println("没有找到要修改的元素");
return;
}
}
//在链表中根据编号删除元素
public void del(int no){
boolean flag = false;
if(head.next == null){
System.out.println("该链表为空");
return;
}
HeroNode temp = head;
while(true){
if(temp.next == null){
break;
}
if(temp.next.no == no){
flag = true;
break;
}
temp = temp.next;
}
if(flag){
//链表中删除元素的重要步骤!!!
temp.next = temp.next.next;
}else{
System.out.println("没有找到待删除元素的编号");
return;
} }
//遍历链表,显示链表中的每个元素
public void list(){
if(head.next == null){
System.out.println("该链表中的元素为空");
return;
}else{
HeroNode temp = head.next;
while(true){
if(temp == null){
break;
}
System.out.println(temp);
temp = temp.next; }
}
}
}

以上就是单链表的增删改查的操作,如果有问题可以留言~  

Java数据结构之单链表的更多相关文章

  1. Java数据结构-03单链表(二)

    在之前我们封装了一些操作在接口类中,并在抽象类实现了相同的方法.下面我们开始写代码: 无头结点单链表:(注意下面的AbstractList是之前抽取的类,不是java.util包下的类) public ...

  2. 图解Java数据结构之单链表

    本篇文章介绍数据结构中的单链表. 链表(Linked List)介绍 链表可分为三类: 单链表 双向链表 循环列表 下面具体分析三个链表的应用. 单链表 链表是有序的列表,它在内存中存储方式如下: 虽 ...

  3. Java数据结构-02单链表(一)

    一.链式存储: ①简述:线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的.存储单元由两部分组成,数据源和指针,数据源放数据,指针指向下个 ...

  4. 数据结构之单链表的实现-java

    一.单链表基本概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元(一般是非连续存储单元)存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点的构成:元素data + 指针next ...

  5. Python数据结构之单链表

    Python数据结构之单链表 单链表有后继结点,无前继结点. 以下实现: 创建单链表 打印单链表 获取单链表的长度 判断单链表是否为空 在单链表后插入数据 获取单链表指定位置的数据 获取单链表指定元素 ...

  6. javascript数据结构之单链表

    下面是用javascript实现的单链表,但是在输出的时候insert方法中存在问题,chrome的console报错说不能读取空的属性,调试了很久都没有通过,先在这里存着,以后再来修改一下. //数 ...

  7. 数据结构(一) 单链表的实现-JAVA

    数据结构还是很重要的,就算不是那种很牛逼的,但起码得知道基础的东西,这一系列就算是复习一下以前学过的数据结构和填补自己在这一块的知识的空缺.加油.珍惜校园中自由学习的时光.按照链表.栈.队列.排序.数 ...

  8. 数据结构(2):单链表学习使用java实现

    单链表是单向链表,它指向一个位置: 单链表常用使用场景:根据序号排序,然后存储起来. 代码Demo: package com.Exercise.DataStructure_Algorithm.Sing ...

  9. 数据结构之单链表(基于Java实现)

    链表:在计算机中用一组任意的存储单元存储线性表的数据元素称为链式存储结构,这组存储结构可以是连续的,也可以是不连续的,因此在存储数据元素时可以动态分配内存. 注:在java中没有指针的概念,可以理解为 ...

随机推荐

  1. Ubuntu终端路径和文件夹相互切换

    一. 环境配置 1. 打开终端输入安装命令 sudo apt-get install nautilus-open-terminal 2. 重新加载文件管理器 nautilus -q 3. 重启电脑 s ...

  2. MyBatis逆向工程无效

    在Taget目录下修改的东西无法逆向, 在源代码目录就可以

  3. css是干什么的

    css这些长篇累牍的参数,其实就是这些所谓的css编程者每天要干的事情了,他们把这些参数熟记于心,就像c++程序员,把这些函数库熟记于心一样,都是编程. css定制了每一个单独的组件,这些组件要么是相 ...

  4. Consul服务发现在windows下简单使用

    目录 基本介绍: 服务连接: 客户端: 系列章节: 回到顶部 基本介绍: 安装: 下载地址:https://www.consul.io/downloads.html 运行: consul agent ...

  5. 将Medium中的博客导出成markdown

    Medium(https://medium.com)(需要翻墙访问)是国外非常知名的一个博客平台.上面经常有很多知名的技术大牛在上面发布博客,现在一般国内的搬运的技术文章大多数都是来自于这个平台. M ...

  6. react找到对象数组中指定的值

    找到对象数组中指定的值var array = [            { label: "Custom", value: "0" },            ...

  7. 使用css3的repeating-linear-gradient画虚线

    还在用 border-style: dashed 画虚线吗?虽然也是虚线,但是不能控制每一个虚线的宽度 .dashed { height: 1px; background-image: repeati ...

  8. HTML第一课(前期知识准备)

    在正式的学习之前,我们先了解一些前端方面的常识. 一.前端是做什么? 如果有认真看过我写的预备程序员不得不知道的事儿这篇文章的同学应该清楚,前端的工作在整个项目开发中处于代码编写阶段,主要是用来做界面 ...

  9. 使用Eclipse-Maven-git做Java开发(3)--Eclipse的安装和配

    使用Eclipse-Maven-git做Java开发(3)--Eclipse的安装和配 https://my.oschina.net/songxinqiang/blog/474530

  10. 39. Combination Sum (Java)

    Given a set of candidate numbers (candidates) (without duplicates) and a target number (target), fin ...