Java数据结构之单链表
这篇文章主要讲解了通过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数据结构之单链表的更多相关文章
- Java数据结构-03单链表(二)
在之前我们封装了一些操作在接口类中,并在抽象类实现了相同的方法.下面我们开始写代码: 无头结点单链表:(注意下面的AbstractList是之前抽取的类,不是java.util包下的类) public ...
- 图解Java数据结构之单链表
本篇文章介绍数据结构中的单链表. 链表(Linked List)介绍 链表可分为三类: 单链表 双向链表 循环列表 下面具体分析三个链表的应用. 单链表 链表是有序的列表,它在内存中存储方式如下: 虽 ...
- Java数据结构-02单链表(一)
一.链式存储: ①简述:线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的.存储单元由两部分组成,数据源和指针,数据源放数据,指针指向下个 ...
- 数据结构之单链表的实现-java
一.单链表基本概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元(一般是非连续存储单元)存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点的构成:元素data + 指针next ...
- Python数据结构之单链表
Python数据结构之单链表 单链表有后继结点,无前继结点. 以下实现: 创建单链表 打印单链表 获取单链表的长度 判断单链表是否为空 在单链表后插入数据 获取单链表指定位置的数据 获取单链表指定元素 ...
- javascript数据结构之单链表
下面是用javascript实现的单链表,但是在输出的时候insert方法中存在问题,chrome的console报错说不能读取空的属性,调试了很久都没有通过,先在这里存着,以后再来修改一下. //数 ...
- 数据结构(一) 单链表的实现-JAVA
数据结构还是很重要的,就算不是那种很牛逼的,但起码得知道基础的东西,这一系列就算是复习一下以前学过的数据结构和填补自己在这一块的知识的空缺.加油.珍惜校园中自由学习的时光.按照链表.栈.队列.排序.数 ...
- 数据结构(2):单链表学习使用java实现
单链表是单向链表,它指向一个位置: 单链表常用使用场景:根据序号排序,然后存储起来. 代码Demo: package com.Exercise.DataStructure_Algorithm.Sing ...
- 数据结构之单链表(基于Java实现)
链表:在计算机中用一组任意的存储单元存储线性表的数据元素称为链式存储结构,这组存储结构可以是连续的,也可以是不连续的,因此在存储数据元素时可以动态分配内存. 注:在java中没有指针的概念,可以理解为 ...
随机推荐
- Java合并数组的实现方式
String[] aa = {"11","22","33"};String[] bb = {"44","55& ...
- SpringBoot 单元测试junit test
pom引用 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http: ...
- Tomcat进程、SFTP服务器
查看Tomcat是否以关闭 ps -ef|grep tomcat port sftp -oPort=60001 root@192.168.0.254
- PHP 堆 栈 数据段 代码段 存储的理解
对象在PHP里面和整型.浮点型一样,也是一种数据类,都是存储不同类型数据用的, 在运行的时候都要加载到内存中去用,那么对象在内存里面是怎么体现的呢? 内存从逻辑上说大体上是分为4段,栈空间段.堆空间段 ...
- 剑指offer-删除链表中重复的结点-链表-python ***
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
- luogu P1399 [NOI2013]快餐店
传送门 注意到答案为这个基环树直径\(/2\) 因为是基环树,所以考虑把环拎出来.如果直径不过环上的边,那么可以在环上每个点下挂的子树内\(dfs\)求得.然后如果过环上的边,那么环上的部分也是一条链 ...
- spark数据结构之RDD
学习spark,RDD是一个逃不过去的话题,那么接下来我们看看RDD 1.什么是RDD? RDD叫做弹性分布式数据集,是Spark中最基本的数据抽象,代表一个不可变.可分区.里面元素可以并行计算的集合 ...
- react-native样式引入
react-native 第一种:在标签内部使用样式 import React from 'react'; class Demo extends React.Component{ render(){ ...
- MySQL索引的分类、结构、使用场景
MySQL索引分类 1.主键索引:设定为主键后数据库会自动建立索引,innodb为聚簇索引 语法: 随表一起建索引: CREATE TABLE customer (id INT(10) UNSIGNE ...
- nmap 扫描出某网段内web服务器
今天碰到一个问题,客户要求在他们内网中扫描出所有web服务器,然后再对web进行渗透测试,共两个网段. 以前我记得用nmap时曾得到过某地址的web服务器数据,比如显示是IIS或apach,但忘了具体 ...