链表

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个结点里存到下一个结点的地址。链表在存储数据结构的内存中有两块区域。一块区域用来存储数据,即数据域。一块区域用来记录下一个数据存在哪里,即指针域(指向下一个数据的指针)。所以单向链表的最后一个结点是指向NULL的

相比数组的优缺点:

优点:在创建的时候不需要规定大小,创建就是动态的。

内存不是连续的,可以充分利用一些碎片空间。

链表在插入和删除数据的时候,时间复杂度为O(1),相对有索引的数组要快很多。

缺点: 链表查找任何一个元素都需要从头结点遍历,时间复杂度为O(n),不如数组可以根据索引直              接定位。

总的来说链表的特点是:随机存储、顺序访问、线性表、链式存储结构。

单向链表

即链表的连接方向是单向的。

单链表的两种创建方式:

头插法:插入的结点在头结点和第一个插入的结点中间。(即第一个插入的结点是尾结点)

尾插法:插入的结点在上一个插入的结点之后。(即最后插入的结点是尾结点)

代码测试

首先创建结点实例

public class PersonNode {//数据域int number;String name;//指针域  下一个结点的地址PersonNode next;public PersonNode (int number,String name){this.number=number;this.name=name;}@Overridepublic String toString() {return "PersonNode{" +"number=" + number +", name='" + name + '\'' +", next=" + next +'}';}
}
单链表类
public class SingleLinkedList {//定义一个头结点  不存储数据结构,只用来存储链表的第一个元素private PersonNode head=new PersonNode(0,"");/***  头插法*/public   void headInsert(PersonNode node){//判断链表是否为空  为空则表明只有头结点 还是第一次插入if(head.next==null){head.next=node;return;}//如果链表不为空  即链表不是第一次插入,将node插入到head和head.next中间PersonNode temp=head.next;  //暂存head的下一个指向head.next=node; //将node插入到head节点后面node.next=temp; //将原本的head.next 插入到node后面}/*** 遍历链表*/public  void LinkedList(){if(head.next==null){System.out.println("链表为空");return;}PersonNode temp =head;while(temp.next!=null){System.out.println(head.next);temp.next=temp.next.next;}}/***  尾插法*/public void tailInsert(PersonNode node){if(head.next==null){head.next=node;return;}PersonNode temp=head;while(temp.next!=null){temp=temp.next;}temp.next=node;}
}

测试类

public class Test {public static void main(String[] args) {SingleLinkedList LinkedList=new SingleLinkedList();PersonNode p1=new PersonNode(1,"张三");PersonNode p2=new PersonNode(2,"张4");PersonNode p3=new PersonNode(3,"张5");PersonNode p4=new PersonNode(4,"张6");
//        System.out.println("测试头插法******");
//        LinkedList.headInsert(p1);
//        LinkedList.headInsert(p2);
//        LinkedList.headInsert(p3);
//        LinkedList.headInsert(p4);
//        LinkedList.LinkedList();System.out.println("测试尾插法****");LinkedList.tailInsert(p1);LinkedList.tailInsert(p2);LinkedList.tailInsert(p3);LinkedList.tailInsert(p4);LinkedList.LinkedList();}
}

运行结果

测试尾插法****
PersonNode{number=1, name='张三', next=PersonNode{number=2, name='张4', next=PersonNode{number=3, name='张5', next=PersonNode{number=4, name='张6', next=null}}}}
PersonNode{number=2, name='张4', next=PersonNode{number=3, name='张5', next=PersonNode{number=4, name='张6', next=null}}}
PersonNode{number=3, name='张5', next=PersonNode{number=4, name='张6', next=null}}
PersonNode{number=4, name='张6', next=null}
测试头插法******
PersonNode{number=4, name='张6', next=PersonNode{number=3, name='张5', next=PersonNode{number=2, name='张4', next=PersonNode{number=1, name='张三', next=null}}}}
PersonNode{number=3, name='张5', next=PersonNode{number=2, name='张4', next=PersonNode{number=1, name='张三', next=null}}}
PersonNode{number=2, name='张4', next=PersonNode{number=1, name='张三', next=null}}
PersonNode{number=1, name='张三', next=null}

从打印结果可以看出来

头插法打印时是倒序打印,第一个进去的结点是尾节点。

尾插法打印时是顺序打印,最后一个插入的结点是尾节点。

值得注意的是:不管链表是否为空,头指针都不为空。头节点可以没有,但头指针必须有

单向链表 头插法尾插法相关推荐

  1. 单链表头插法和尾插法

    1.头插法 头插法:每次把新节点插入到头节点之后,创建的单链表和数据输入顺序相反. 防止单链表是空的而设的. 当链表为空的时候,带头结点的头指针就指向头结点,头结点的指针域存储的数值为NULL. &l ...

  2. java实现单链表的建立(头插法和尾插法)

    单链表 单链表(Single Linked List): 单链表是一种链式存取的数据结构,用一组地址任意(可能连续,也可能不连续)的存储单元存放线性表中的数据元素. 链表中的数据是以结点来表示的,每个 ...

  3. C语言的单链表创建:头插法/尾插法

    文章目录 前言 链表头插法 链表尾插法 源码实现 前言 接下来一段时间,将对数据结构进行复习,总的来说数据结构自大学之后忘记得有点吓人,为了防止脑容量本就小得脑袋更小,必须得持续性得温故了. 链表数据 ...

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

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

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

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

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

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

  7. C语言头插法尾插法创建单链表

    前言 链表 [Linked List]:链表是由一组不必相连[不必相连:可以连续也可以不连续]的内存结构 [节点],按特定的顺序链接在一起的抽象数据类型. 下面介绍单链表的创建: 创建节点 链表是由一 ...

  8. 不带头结点的单链表的创建(头插法和尾插法)

    1.用头插法建立不带头结点的单链表 #include<iostream> using namespace std;//单链表的结构体 typedef struct Node {int da ...

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

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

  10. 单链表的头插法尾插法及删除节点操作

    带头节点的单链表的头插法尾插法及删除节点操作 链表的操作对于初学者来说理解非常有难度,初学的同学们应该在学习链表的过程中多再练习本上画图,写一行代码就画出代码执行后链表各节点图的变化,方便理解.我也是 ...

最新文章

  1. 2022-2028年中国车载充电机行业深度调研及投资前景预测报告
  2. 微软企业服务部华东区招聘顾问/架构师/.NET高级开发员
  3. 为什么站点实现了https加密之后还是能看到相关数据
  4. C++ Primer 5th笔记(7)chapter7 类
  5. javascript中神奇的(+)加操作符
  6. PHP基于单例模式编写PDO类的方法
  7. how is our class instance registered - thanks to AnnotationConfigWebApplicationC
  8. PL/SQL 语言 一
  9. [gkk传智]static与多态及向下向上转型,及多态调用总结
  10. 本周Web2.0小工具推荐[2008-09-13]
  11. 好心酸!三星可折叠屏手机Galaxy Fold下月也无法发货
  12. 日前加拿大平板厂商 Datawind和印度运营商Reliance Communications日前宣布合作
  13. Linux-第二篇常用命令
  14. 三星emcp型号详解_三星emcp型号详解_eMCP终将成为过去式?解析:三星、美光所推出的uMCP为何物?......
  15. [秩相关] Spearman秩相关系数计算及假设检验
  16. matlab erf erfi,误差函数
  17. matlab之在坐标区上添加图例函数legend
  18. python如何导入excel表格_使用Python读取电子表格中的数据
  19. 2018区块链技术及应用峰会(BTA)倒计时2天,最强百人区块链大咖齐聚
  20. 高稳定度低纹波直流电源设计 【转自电子工程师世界】

热门文章

  1. 微信支付接口--支付成功的回调--超详细Demo
  2. C# 引用C++动态库方法
  3. hadoop各种发行版本
  4. 抖音一键批量下载无水印视频,这款软件帮助你
  5. java iplimage 头文件_JavaCV – 为什么IplImage.createFrom(image)不再存在?
  6. nohup python
  7. 新点软件怎么导入清单_excle表怎么导入新点,怎样把EXCEL表格导入project 中?
  8. Python三次样条插值
  9. C++十进制二进制十六进制转换
  10. 【EMC专题】浪涌抗扰度测试