什么是单链表

在了解单链表之前,你知道什么是链表吗?如果你不知道什么是链表,可以看看我的这篇博客

单链表是链表的其中一种基本结构。一个最简单的结点结构如图所示,它是构成单链表的基本结点结构。在结点中数据域用来存储数据元素,指针域用于指向下一个具有相同结构的结点。

因为只有一个指针结点,称为单链表。

单链表中三个概念需要区分清楚:分别是头指针,头节点和首元节点。

头结点、头指针和首元结点(此段转自@ciyeer大牛的博客)

头结点:有时,在链表的第一个结点之前会额外增设一个结点,结点的数据域一般不存放数据(有些情况下也可以存放链表的长度等信息),此结点被称为头结点。

若头结点的指针域为空(NULL),表明链表是空表。头结点对于链表来说,不是必须的,在处理某些问题时,给链表添加头结点会使问题变得简单。

首元结点:链表中第一个元素所在的结点,它是头结点后边的第一个结点。

头指针:永远指向链表中第一个结点的位置(如果链表有头结点,头指针指向头结点;否则,头指针指向首元结点)。

头结点和头指针的区别:头指针是一个指针,头指针指向链表的头结点或者首元结点;头结点是一个实际存在的结点,它包含有数据域和指针域。两者在程序中的直接体现就是:头指针只声明而没有分配存储空间,头结点进行了声明并分配了一个结点的实际物理内存。

单链表中可以没有头结点,但是不能没有头指针!

头节点的引入能使链表对第一个元素的删除和插入和其他元素相同,不用另外说明,使得代码更加简洁。

单链表的基本操作

单链表的基本操作有:增(add),删(remove),改(set),查(find),插(insert)等。

在这里我们只讲解add,remove,insert三个操作,其他实现看源码。

单链表增添元素

声明一个新节点node作为新的尾节点,next=null;

获取原链表的最后一个节点,把它的next指向1步骤的新节点node

记录链表长度的变量+1

public void add(AnyType a){

Node renode=new Node<>(a,null);

getNode(thesize-1).next=renode;

thesize++;

}

单链表删除元素

获取需要删除的节点的上一个节点node

把node的next指向node的next的next

因为node的next节点没有指针指向它,因此它会被系统自动清理

记录链表长度的变量-1

public AnyType remove(int i){

Node prev=getNode(i-1);

AnyType a=prev.next.data;

prev.next=prev.next.next;

thesize--;

return a;

}

单链表插入元素

获取需要插入的位置的节点;

声明一个新节点node指向1步骤得到的节点;

获取需要插入位置节点的上一个节点;

将3步骤得到的节点的next指向新节点node;

记录链表长度的变量+1。

public void insert(int i,AnyType a){

Node prev=getNode(i-1);

Node renode=new Node<>(a,prev.next);

prev.next=renode;

thesize++;

}

源码实现(java)

/*

结点

*/

public class Node {

public AnyType data;

public Node next;

public Node(AnyType data,Node next){

this.data=data;

this.next=next;

}

}

-----

public class MyLinkList {

//首元节点

private Node first;

//头指针

private Node head;

//链表长度

int thesize;

//初始化链表

public boolean initlist(){

thesize=0;

first=new Node<>(null,null);

head=new Node<>(null,first);

return true;

}

//判断链表是否为空

public boolean isEmpty(){

return thesize==0;

}

//获取节点

public Node getNode(int i){

Node renode=head;

for(int j=-2;j

renode=renode.next;

}

return renode;

}

//在末尾添加元素

public void add(AnyType a){

Node renode=new Node<>(a,null);

getNode(thesize-1).next=renode;

thesize++;

}

//删除i位置节点,并返回删掉的数据

public AnyType remove(int i){

if(i==thesize-1){

AnyType a=getNode(thesize-1).data;

getNode(thesize-2).next=null;

return a;

}

Node prev=getNode(i-1);

AnyType a=prev.next.data;

prev.next=prev.next.next;

thesize--;

return a;

}

//在i位置插入新节点

public void insert(int i,AnyType a){

Node prev=getNode(i-1);

Node renode=new Node<>(a,prev.next);

prev.next=renode;

thesize++;

}

//获取i位置节点的数据

public AnyType get(int i){

return getNode(i).data;

}

//为i位置元素重新赋值

public void set(int i,AnyType a){

getNode(i).data=a;

}

//返回链表节点个数

public int length(){

return thesize;

}

//清空链表

public void clear(){

initlist();

}

//打印链表

public void print(){

for(int i=0;i

System.out.println(getNode(i).data);

}

}

}

java单链表_(java实现)单链表相关推荐

  1. c++ 链表_算法学习笔记 - 链表 - 单链表的粗糙实现

    常用的链表有单链表.双链表.循环链表. 概念看得再多,理解得再多,也不一定能够写得出来.所以动动手,多练习才是提升能力的关键. 有朋友留言说道:建议大家在实现之前的思考时间不要太长.一是先用自己能想到 ...

  2. php mysql 链表_浅谈PHP链表数据结构(单链表)

    链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个程序运行时,内存分成五个区(堆区, ...

  3. java工单管理系统_企业工单管理系统--使用mybatis

    1,要求 四种框架中的一种来实现企业工单管理系统,Oracle 10g/11g 或 MySQL 5 作为后台数据 库.该系统包括查看所有的项目信息.选择项目后进行工单添加.添加完毕后显示添加后的工单 ...

  4. java 防钓鱼_验证表单重复提交(防止钓鱼,密码加密,自定义标签,过滤器)...

    包含几种加密方法 package com.chinasofti.util.sec; import java.io.IOException; import java.io.UnsupportedEnco ...

  5. java取负数_[Java] 告别“CV 工程师”码出高效!(基础篇)

    作为一名资深的 CV 工程师,某天,当我再一次日常看见满屏的报错信息与键盘上已经磨的泛白的 Ctrl.C.V 这三个按键时,我顿悟了. 百度谷歌复制粘贴虽然很香,但是总是依靠前人种树,终会有一天失去乘 ...

  6. python链表_使用python实现链表操作

    一.概念梳理 链表是计算机科学里面应用应用最广泛的数据结构之一.它是最简单的数据结构之一,同时也是比较高阶的数据结构(例如棧.环形缓冲和队列) 简单的说,一个列表就是单数据通过索引集合在一起.在C里面 ...

  7. java控制语句练习题_[Java初探实例篇02]__流程控制语句知识相关的实例练习

    本例就流程控制语句的应用方面,通过三个练习题来深入学习和巩固下学习的流程控制语句方面的知识,设计到,if条件判断语句,switch多分支语句,for循环语句及其嵌套多层使用,while循环语句. 练习 ...

  8. java 文本压缩_[Java基础]Java使用GZIP进行文本压缩

    import java.io.IOException; import java.util.zip.GZIPOutputStream; import org.apache.commons.io.outp ...

  9. python线程安全的单例_[python笔记] 单例的几种实现方式(线程安全)

    单例实现方式: 1.单例装饰器; 2.使用类: 3.使用元类 1.单例装饰器(非线程安全) 通过装饰器使一个类变成单例类,但是并非线程安全的,多线程状态下,每个线程创建不同的实例,因为没有加线程锁,所 ...

最新文章

  1. 从白盒测试到单元测试基础原理
  2. html-body标签中相关标签 02
  3. CSS Sprites (CSS精灵)
  4. 003_html编辑器
  5. DLNA, PulseAudio, diffpatch, bash
  6. arch linux界面优化,Archlinux 启动优化
  7. 1040 有几个PAT (25 分
  8. Codeforces 1182A Filling Shapes
  9. 25 SD配置-主数据-信用管理-定义信用段
  10. android左右滑动fragment,Android基于ViewPager+Fragment实现左右滑屏效果的方法
  11. Linux文章大合集
  12. 【晒出你的第83行代码】跬步千里,十二年的老代码更是技术的沉淀!
  13. Android手机进入9008高通模式(以小米手机为例)
  14. 2048游戏java教程_java版实现2048游戏功能
  15. Spring中的 @Lazy注解简析
  16. kafka是什么?深刻理解kafka
  17. 最容易被人工智能取代的10种职业,今年换工作别入坑了!
  18. 地磁系统相对于机器视觉的优势
  19. Matlab 音频格式转换(wav,ogg,flac,au,aiff,aif,aifc,mp3,m4a,mp4 互转)
  20. 【2022.05.31】大学本科毕业总结,再见北理工

热门文章

  1. 网页速度很慢优化方案:如何提高网页加载速度,提升网站加载速度
  2. 计算机课Word自我介绍,第5课 用WORD写篇自我介绍.doc
  3. 资源放送丨《MySQL的查询与优化》PPT视频
  4. 深入解析TRUNCATE TABLE – 手工修复和验证过程
  5. 12.2 新特性:锁信息获取之在线删除索引
  6. 华山论“件”:Kafka、RabbitMQ、RocketMQ技能大比拼
  7. 带你了解VXLAN网络中报文的转发机制
  8. 技巧收藏|10个JavaScript常用数组操作方法
  9. 聆听无声的话语:手把手教你用ModelArts实现手语识别
  10. 【华为云技术分享】看得见的安心,一手掌握华为云DRS迁移进度