这篇文章主要讲解了通过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. HDU 1043 Eight 八数码问题 A*算法(经典问题)

    HDU 1043 Eight 八数码问题(经典问题) 题意 经典问题,就不再进行解释了. 这里主要是给你一个状态,然后要你求其到达\(1,2,3,4,5,6,7,8,x\)的转移路径. 解题思路 这里 ...

  2. Intellij IDEA奇巧妙计(不停更新)

    1,在pom.xml文件中,Ctrl+Shift+Alt+U打开Manven依赖视图 2,Alt+7 查看类里面方法,变量等结构 3, Shift+Esc 收缩编译提示框 4, ctrl+r 替换本页 ...

  3. SQL Server to MySQL

    使用 Navicat 导入向导迁移 会遇到以下问题 SQL Server 中的 GUID 类型字段会变成 {guid} 多个外层花括号, 导致程序问题. 部分字段类型长度不大一致, 需要手工调整. . ...

  4. 在django中使用循环与条件语言

    {% if not Article_type_id %} <li class="active"><a href="/">全部</a ...

  5. 缓存字节流-写coppy方法

    package ba; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io. ...

  6. todo JVM笔记

    之前给自己定了很多计划,要学Dubbo,Netty,SSHM源码,Tomcat源码...这些基本浅尝辄止,很难继续研读,过不了多久就忘了. 觉得还是基础不够,所以决定把<JVM>.< ...

  7. XIB约束布局问题(通过优先级改变界面布局)

    需要注意的是,只能修改可选约束的优先级,也就是说: 不允许将优先级由小于1000的值改为1000 不允许将优先级由1000修改为小于1000的值 例如,如果将优先级由250修改为1000,则会抛出异常 ...

  8. Result window is too large, from + size must be less than or equal to: [10000] but was [78440]. See the scroll api for a more efficient way to request large data sets

    {"error":{"root_cause":[{"type":"query_phase_execution_exception& ...

  9. Nginx服务项的基本配置

    由于Nginx配置项较多,把他们按照用户使用时的预期功能分为以下4类: 1.调试,定位问题的配置项 2.正常运行必备配置项 3.优化性能配置项 4.事件类配置项 1. 用于调试进程,定位问题的配置项 ...

  10. $strobe$monitor$display

      $strobe:当该时刻的所有事件处理完后,在这个时间步的结尾打印一行格式化的文本,语法$strobe( Argument,...);$fstrobe( Mcd, Argument,...);Mc ...