02.单链表-史上最清晰的尾插法和头插法

1.单链表

  • 链表是一系列的存储数据元素的单元,通过指针(引用)串联起来的,因此每个单元至少有两个域,一个域用于数据元素的存储,另一个域是指向其他单元的指针。
  • 单链表是链表的其中一种基本结构。一个最简单的结点结构如图所示,它是构成单链表的基本结点结构。
    • 在结点中数据域用来存储数据元素,指针域用于指向下一个具有相同结构的结点。

2.链表定义

  • 链表可增加任意类型数据元素,将其类LinkList定义为泛型。
  • 定义头指针head、及链表长度size。
  • 定义内部类Node,同样为泛型。
    • 定义泛型对象E element
    • 节点类Node next
public class LinkList<E> {Node head = null ;public int size = 0;//定义内部类Node(存在泛型E和节点Node)private class Node<E>{E element;Node next;public Node(E element, Node next) {this.element = element;this.next = next;}}}

3.链表长度

 public int size(){return  size;}

4.头插法

4.1头插法:把后建立的结点插在头部。用这种方法建立起来的链表的实际顺序与输入顺序刚好向反,输出时为倒序!

  • 图解:

  • 说明

    • 第1步,把新节点的next指针指向原先的头结点:Node node = new Node<>(element,head);
    • 第2步,把新节点变为链表的头结点: head = node;
    • 最后size自增。
   public void addFirst(E element){Node node = new Node<>(element,head);head = node;size++;}

5.尾插法

  • 图解

  • 说明

    把最后一个节点的next指针指向新插入的节点即可。

    • 注意点:

      1. 需要判断链表首次插入是否为空,
      2. 依次从头遍历链表,循环条件:0到size-1,取得最后一个节点。
      3. 通过new Node(element,proNode.next)将新创建的节点指向最后一个节点。
      4. 最后在将最后节点的指针指向新节点、即可。
    public void addTail(E element){if (head == null){Node node = new Node<>(element , head);head = node;size++;}else{Node preNode = head;for (int i = 0 ; i < size - 1 ; i++){preNode = preNode.next;}preNode.next = new Node(element,preNode.next);size++;}}

6.重写toString方法

 public String toString(){StringBuilder str = new StringBuilder();Node node = head;str.append("size: ").append(size);str.append(" link: [");while(node != null){str.append(node.element);if (node != null){str.append("--->");}node = node.next;}str.append("]");return str.toString();}

7.完整代码实现

  • 方法类
package demo.linkdemo;public class LinkList<E> {Node head = null ;public int size = 0;//定义内部类Node(存在泛型E和节点Node)private class Node<E>{E element;Node next;public Node(E element, Node next) {this.element = element;this.next = next;}}/*** 求链表长度* @return*/public int size(){return  size;}public void clean(){head = null;size = 0;}/*** 头插法* @param element*/public void addFirst(E element){Node node = new Node<>(element,head);head = node;size++;}/*** 尾插法* @param element*/public void addTail(E element){if (head == null){Node node = new Node<>(element , head);head = node;size++;}else{Node preNode = head;for (int i = 0 ; i < size - 1 ; i++){preNode = preNode.next;}preNode.next = new Node(element,preNode.next);size++;}}/*** 打印集合* @return*/public String toString(){StringBuilder str = new StringBuilder();Node node = head;str.append("size: ").append(size);str.append(" link: [");for (int i = 0 ; i < size ; i++){str.append(node.element);if (node.next != null){str.append("--->");}node = node.next;}str.append("]");return str.toString();}}
  • 测试类
package demo.linkdemo;public class LinkListTest {public static void main(String[] args) {LinkList list = new LinkList();System.out.println("-------------头插法---------------");list.addFirst("001");list.addFirst("002");list.addFirst("003");list.addFirst("004");list.addFirst("005");System.out.println(list);list.clean();System.out.println("-------------尾插法---------------");list.addTail("001");list.addTail("002");list.addTail("003");list.addTail("004");list.addTail("005");System.out.println(list);}
}

8.测试结果

单链表-史上最清晰的尾插法和头插法相关推荐

  1. 史上最清晰的函数空间讲解

    史上最清晰的函数空间讲解 1.什么是数学的空间? 数学的空间定义了研究工作的对象和遵循的规则,研究工作的对象在空间中称之为元素,遵循的规则在空间中称之为结构,结构有线性结构(加法和数乘)和拓扑结构(距 ...

  2. 146_路由器项目_附加功能:可以拿取文件内IP保存到过滤链表中,过滤IP也可以保存到txt文件,也可以终端输入IP,保存到文件【单链表的尾插、头插、删除指定节点、遍历等】】

    动图: ip_file.h: #ifndef IP_FILE_H #define IP_FILE_H #include <stdio.h> #include <string.h> ...

  3. (王道408考研数据结构)第二章线性表-第三节1:单链表的定义及其操作(插入和删除,建立之尾插和头插)

    文章目录 一:单链表相关 (1)单链表的定义 (2)头指针与头结点 二:单链表代码描述 三:单链表的初始化 四:单链表的插入 五:单链表的删除 六:单链表查找 (1)按位查找 (2)按值查找 七:单链 ...

  4. 单链表的尾插,头插,遍历,查找和插入

    单链表的基本结构 function Node(val,next){this.val = val;this.next = next || null; } 1.链表的创建 a.尾插法,就是正常的尾部顺序插 ...

  5. 单链表的基本操作(初始化,前插,后插,删除查找,排序)

    /*        // Project: single linkeed list (数据结构 单链表)        // Date:    2021-10-7 09:26:57       // ...

  6. 链表反转的四种方法(栈、头插法、三指针法、递归法)

    单链表反转或转置的四种方法 链表的反转实质上是反转链表上的内容: 若链表存储的数据是:1->2->3->4->5; 那么反转后则是:5->4->3->2-&g ...

  7. 史上最清晰的Java内存模型介绍

    这篇文章的标题看起来很霸气,于是我毫不犹豫转了~并且同样起了个霸气侧漏的标题! 本文转载自:再有人问你Java内存模型是什么,就把这篇文章发给他. 网上有很多关于Java内存模型的文章,在<深入 ...

  8. C# 直接选择排序(史上最清晰,最通俗)

    public void SelectSort(int[] array) { int len = array.Length; int minValIndex; //无序区中最小值的索引 int i; / ...

  9. 史上最清晰的红黑树讲解(上)(转自CarpenterLee,纯学习用)

    本文以Java TreeMap为例,从源代码层面,结合详细的图解,剥茧抽丝地讲解红黑树(Red-Black tree)的插入,删除以及由此产生的调整过程. 总体介绍 Java TreeMap实现了So ...

最新文章

  1. 在数据库组件中用业务规则剖析挑选数据
  2. 开源企业级数字化服务平台——Choerodon猪齿鱼发布0.8版本
  3. linux shell中21的含义
  4. Streaming Big Data: Storm, Spark and Samza--转载
  5. c语言倒序输出字符串数组,【C语言】利用栈将数组中字符串逆序
  6. 计算机二级web题目(6)--动态网页技术概述
  7. 12个git实战建议和技巧
  8. 默写标准答案0917
  9. java排序方法调用_Java实现顺序查找、二分查找、冒泡排序、方法调用
  10. 【二分法】计蒜客:求方程的近似解
  11. Android高级控件(六)——自定义ListView高仿一个QQ可拖拽列表的实现
  12. Windows下CMake的下载与安装详解
  13. aliyun的产品都是有哪些,主要是做什么的呢?
  14. Java基础系列28-常用api之包装类
  15. arcgis for js3.3、3.4版本 计算面积出错的问题
  16. centos7 nuxeo platform 集成 onlyoffice,搭建企业级内容管理系统
  17. 拼多多算法岗第一场笔试 2020.08.02
  18. uboot启动Linux内核(一):uboot启动流程
  19. 《老罗的Android之旅》导读PPT
  20. 【C语言】从键盘输入一个自然数n,再输入n个自然数,求出这n个自然数的最大值max和最小值min

热门文章

  1. Vue粒子特效(vue-particles插件)
  2. 我的前端项目目录约定和基础规范建议。一个5年前端接触者的推荐
  3. java easing_jQuery中常用的函数方法总结
  4. 毕业设计-基于SpringBoot就业管理系统
  5. 文本溢出处理显示省略号
  6. 黑马OC听课笔记(第一天)
  7. Portal相关技术及架构
  8. Haydn解决方案数字化平台助力架构师1小时完成架构设计(实操篇)
  9. GSM和CDMA手机在发生CSFB时的区别
  10. 大学高校供配电系统谐波危害及治理方案