单链表


单链表(Single Linked List):

  • 单链表是一种链式存取的数据结构,用一组地址任意(可能连续,也可能不连续)的存储单元存放线性表中的数据元素。
  • 链表中的数据是以结点来表示的,每个结点的构成
    data域–存放结点值的数据域
    next域–存放结点的直接后继的地址的指针域(链域)
  • 链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的
  • 单链表的每个结点只有一个next域
  • 头指针head:单链表中每个结点的存储地址是存放在其前趋结点next域中,而开始结点无前趋,故应设头指针head指向开始结点。
  • 终端结点无后继,故终端结点的指针域为空,即NULL。

单链表的两种建立方式

  • 单链表的建立有头插法、尾插法两种方法。

  • 单链表是用户不断申请存储单元和改变链接关系而得到的一种特殊数据结构,将链表的左边称为链头,右边称为链尾。

  • 头插法:右端固定,向左延伸,最先得到的是尾结点

  • 尾插法:左端固定,向右延伸,最先得到的是头结点

  • 画个图简单示意下两个的区别

  • 实现思路分析

  1. 头插法
  2. 尾插法
  • 代码实现
public class SingleLinkedListDemo {public static void main(String[] args) {PersonNode person1 = new PersonNode(1, "Mary", "董事长");PersonNode person2 = new PersonNode(2, "Bob", "总经理");PersonNode person3 = new PersonNode(3, "Tom", "架构师");PersonNode person4 = new PersonNode(4, "Jenny", "工程师");SingleLinkedList singleLinkedList = new SingleLinkedList();
//        System.out.println("头插法测试");
//        singleLinkedList.headInsert(person1);
//        singleLinkedList.headInsert(person2);
//        singleLinkedList.headInsert(person3);
//        singleLinkedList.headInsert(person4);
//        singleLinkedList.list();System.out.println("尾插法测试");singleLinkedList.tailInsert(person1);singleLinkedList.tailInsert(person2);singleLinkedList.tailInsert(person3);singleLinkedList.tailInsert(person4);singleLinkedList.list();}
}/*** 链表*/
class SingleLinkedList {// 定义一个头结点,不存储结点数据,只是用来指向链表的第一个元素private PersonNode head = new PersonNode(0, "", "");/*** 头插法** @param node 待插入结点*/public void headInsert(PersonNode node) {// 判断链表是否为空,如果为空,则将head.next指向nodeif (head.next == null) {head.next = node;return;}// 如果链表不为空,找到head.next,将node插入head和head.next之间PersonNode temp = head.next;head.next = node;  // head.next指向nodenode.next = temp;  // node.next指向之前的head.next}/*** 尾插法** @param node 待插入结点*/public void tailInsert(PersonNode node) {// 如果链表为空,直接head.next = nodeif (head.next == null) {head.next = node;return;}// 如果链表不为空,遍历查找最后一个结点PersonNode temp = head.next;while (true) {// 这里的条件注意下,使用temp.next==null,不要用temp==null, 两者的区别体会一下,我自己在写的时候就写成后者了if (temp.next == null) {break;}temp = temp.next;}// 跳出循环后,temp即为我们要找的链表的最后一个结点,直接temp.next=nodetemp.next = node;}/*** 遍历打印链表结点数据*/public void list() {// 如果链表为空,返回if (head.next == null) {System.out.println("链表为空。");return;}// 如果链表不为空,遍历// head标识链表的头部,不要动,定义一个临时引用,用来遍历链表PersonNode temp = head.next;while (true) {// 如果temp为空,说明链表已经到达尾部,跳出循环if (temp == null) {// 此时temp表示last.next = temp,即最后一个结点指向它break;}// 如果temp不为空,打印tempSystem.out.println(temp);// temp后移,继续遍历temp = temp.next;}}
}/*** 结点*/
class PersonNode {int no;String name;String job;PersonNode next;public PersonNode(int no, String name, String job) {this.no = no;this.name = name;this.job = job;}public PersonNode() {}public int getNo() {return no;}public void setNo(int no) {this.no = no;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}public PersonNode getNext() {return next;}public void setNext(PersonNode next) {this.next = next;}@Overridepublic String toString() {return "PersonNode{" +"no=" + no +", name='" + name + '\'' +", job='" + job +'}';}
}
  • 来测试总结一把


    使用两种方式先往链表添加4个personNode,然后list()遍历打印。
    注意观察两种方式的no编号和插入顺序比较
    我们添加的顺序是1,2,3,4;
    头插法插入后链表的顺序是4,3,2,1;
    尾插法插入后链表的顺序是1,2,3,4;
    我们可以得出结论:
    头插法(往head的后面插入)插入后链表的顺序与插入顺序相反,也就是逆序插入;
    尾插法(往链表尾部的后面插入)插入后链表的顺序与插入顺序相同,也就是顺序插入;
    这里的逆序和顺序是由单向链表只能单向检索的特性决定的,并不是真的逆序和顺序插入
    具体使用哪种方式,根据业务需求确定

java实现单链表的建立(头插法和尾插法)相关推荐

  1. 单链表建立——头插法和尾插法

    引言 当我们准备采用单链表形式实现线性表,第一步就是要建立单链表,即初始化.由于链表是一个动态结构,不需要预先分配空间,因此生成链表的过程就是"逐个插入"的过程,插入结点的位置可以 ...

  2. C语言-链表的创建头插法和尾插法(有无头节点)

    文章目录 结构声明 1 头插法(有头节点) 2 头插法(无头节点) 3 尾插法(有头节点) 4 尾插法(无头节点) 结构声明 typedef int ElementType;typedef struc ...

  3. 采用头插法和尾插法建立单链表

    面说一下如果用C语言建立单链表,分为头插法和尾插法两种. 采用头插法建立单链表 该方法从一个空表开始,生成新结点,并将读取到的数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头,即头结点之后 ...

  4. C语言的双向链表头插法和尾插法,指定节点删除

    文章目录 前言 头插法 尾插法 删除节点 测试代码如下 前言 双向链表和单链表的唯一区别就是多个一个指针域而已,该指针域可以访问链表的上一个节点. 关于构造双向链表的过程我们常见的有两种方法,和单链表 ...

  5. 头插法和尾插法的详细区别

    浅析线性表(链表)的头插法和尾插法的区别及优缺点 线性表作为数据结构中比较重要的一种,具有操作效率高.内存利用率高.结构简单.使用方便等特点,今天我们一起交流一下单向线性表的头插法和尾插法的区别及优缺 ...

  6. 头插法和尾插法建立带头节点的单链表

    有两种方法建立单链表,尾插法和头插法,他们的区别是:头插法是按照输入元素倒序建立,为尾插法为顺序插入,并且多一个尾节点,我们一般使用尾插法. 一.头插法 代码为: pCurr -> next = ...

  7. c语言 链表建立头插法尾插法,单链表的创建(头插法和尾插法)

    单链表的创建分为头插法和尾插法,头插法是不断地向头结点插入新的结点.这样会使你所插入的结点值呈现逆序,所以头插法也可以实现单链表的逆置.尾插法是不断地向插入的新元素之后再插入新的元素.需要注意的是头插 ...

  8. 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表

    http://blog.csdn.net/abclixu123/article/details/8210109 链表也是线性表的一种,与顺序表不同的是,它在内存中不是连续存放的.在C语言中,链表是通过 ...

  9. 单链表的头插法和尾插法c语言实现

    /*单链表的头插法和尾插法c语言实现*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #d ...

  10. 头插法和尾插法创建链表(有无头结点)

    头插法和尾插法创建链表(有无头结点) 文章目录 头插法和尾插法创建链表(有无头结点) 1 头插法 1.1头插法建表规则: 1.2 头插法建表代码实现 2 尾插法 2.1 尾插法建表规则: 2.2 尾插 ...

最新文章

  1. java arcengine_在Java程序中调用ArcEngine
  2. js左侧三级菜单导航代码
  3. 华硕笔记本自带win10改win7的方法
  4. PyTorch基础(11)----- torch.sum()方法
  5. python循环实验心得_2019.06.18学习python循环总结
  6. 轻快的VIM(三):删除
  7. 事业单位计算机初级考试科目一模拟试题,广东教师资格考试之科目一模拟题
  8. python网站有中文界面吗_手把手教你用python开发界面程序
  9. string 常用函数
  10. JIRA和Confluence更改JVM内存大小解决访问打开缓慢问题
  11. 【编辑器】VSCode界面美化,图标与主题插件大全
  12. miniconda安装BWA 以及miniconda的环境配置
  13. 使用cookie,点击关闭一天后显示的弹窗
  14. 二分排序(java)
  15. 退火算法(Annealing)简介与详解
  16. 有没有好用的文字转语音的工具帮推荐?
  17. EasyGUI-1:模块基础
  18. 跨考计算机专业怎么学,跨考计算机考研经验分享
  19. 无人机与地面站如何通信
  20. oracle 证件脱敏存储过程

热门文章

  1. 新婚老公的忏悔信(爆笑)[转]
  2. ROS操作系统快速入门
  3. 【自己动手设计一个简单的加密算法Python】
  4. SQL数据库质疑怎么解决呢?
  5. 最近很火的在线文件预览txt、doc、ppt、pdf、excel、jpg、png、zip、tar.gz等各种文件及压缩文件在线解压和预览,包括前后端设计和源码,编写搜索引擎多关键词检索名称和内容(四)
  6. linux中的head 显示文件头部内容、tail 输出文件尾部内容
  7. Oracle - Database 甲骨文
  8. 什么是蜘蛛统计 有什么作用?
  9. OpenCV基于dlib进行人脸关键点检测(摄像头)
  10. rec卡刷root吗,卡刷需要root权限吗