Java算法基础 - 单链表详解(文末有配套视频)

简介: 咳咳,我是小白,没错,主线剧情又回来了。现在我遇到麻烦了,老板要我设计一个类,可以用来保存多个客户的资料。

步骤 1 只用Java类能实现吗?

以我目前掌握的Java技能,只知道可以新建Java类,然后在Java类里面写属性和方法。现在我已经有了顾客类,我可以通过这个类new出很多个顾客对象。但是问题来了,我怎么保存这些对象呢?


比如今天有10个顾客来登记信息,我必须得有一个东西,来装这些顾客对象啊。


哎呀真搞不懂老板怎么想的,直接用小本子记下来不就行了吗,非要做什么系统。


不过现如今只能好好想想了,emmm,我可以只用Java类实现吗?


步骤 2 类里面有顾客属性

嗯,目标是明确的,我需要写一个Java类,然后这个类可以存放顾客的信息。我在tool文件夹里面随便写了一个CustNode.java(意思就是顾客的节点类):

35.png

代码如下:

package tool;
import entity.Customer;
class CustNode{
  public Customer data; 
}

CustNode类里面维护一个顾客的属性,为了方便起见,就直接用public了,反正我们自己用用的,无所谓。


步骤 3 排队打饭


可是这样也没用啊,这个类最多就是维护一个顾客的信息,没办法保存多个顾客啊。这可愁死我啦,想了老半天也没想出办法来。于是,我就去请教老板,老板正在炒菜,没空搭理我,但是也没赶我走。


“这样吧,马上会有很多顾客来取餐,想不出来就先放放,你在这帮我看着。”老板说。


“让我看排队啊,这有啥意思哦?”我虽然满腹牢骚,但还是照做了,一边拿出手机刷刷微博,一 边看着顾客在排队取餐。


没想到,看着看着,我突然有了灵感。


步骤 4 从一个顾客联系到另一个顾客

36.png

顾客A,B,C三个人在排队,顾客A知道他前面的是顾客B,顾客B知道他前面的是顾客C。那么从程序的角度来看,A里面肯定有一个属性是B的引用,B里面肯定有一个属性是C的引用。

那么,我只要在CustNode里面维护下一个数据的引用,不就可以实现在一个类里面保存多个顾客了吗?


步骤 5 加一个next字段

class CustNode{
  public Customer data; 
  public CustNode next;
}


next就代表下一个数据。

步骤 6 有参构造方法

为了方便起见,我写一个有参数的构造方法,这样的好处就是new的时候直接就可以给data赋值了。


class CustNode{
  public Customer data; 
  public CustNode next;
  public CustNode(Customer data){
    this.data = data;
  }
}

步骤 7 用一个新的类维护CustNode

我盯着CustNode类看了半天,发现一个事情,就是如果我用这个类,最多只能装两个顾客,一个data,一个next。如果再装,就有点难度了。所以,我需要再写一个类,来维护CustNode,然后再提供一个一个add方法和display方法,分别用来添加和展示顾客的数据。

我憋了半天终于把代码写出来了。


步骤 8 TuziLinkedList.java


package tool;
import entity.Customer;
import tool.CustNode;
public class TuziLinkedList{
  public CustNode firstNode; //第一个节点 
  public CustNode currentNode;//当前的节点
  //新增的方法
  public void add(Customer cst){
    //将数据用节点类包装好,这样才能实现下一个数据的指向
    CustNode data = new CustNode(cst);
    //先判断是否是第一个节点
    if(this.firstNode == null){
      this.firstNode = data;
      this.currentNode = data;
    }else{
      //不是第一个节点,就指向当前节点的下一个节点,即currentNode.next
      this.currentNode.next = data;
      //因为已经指向下一个了,所以当前节点也要移动过来
      this.currentNode = data;
    }
  }
  //展示所有节点
  public void display(){
    //第一步,肯定是展示第一个节点(this其实可以省略的)
    if(firstNode != null){
      System.out.println(firstNode.data.getName());
      //然后循环,一直寻找next是否为空
      CustNode node = firstNode.next;
      while(node != null ){
        String name = node.data.getName();
        System.out.println(name);
        //循环的最后,再指向下一个节点,继续下一轮
        node = node.next;
      }
    }
  }
}


步骤 9 设计思路

37.png


步骤 10 原来这就是单链表

后来查了资料才知道,哦,原来这个属于一种数据结构,叫做链表结构。

步骤 11 Customer.java

我修改了一些类的访问权限和代码,顾客类针对name增加了get方法和set方法。


package entity;
public class Customer {
  String name;    // 客户姓名
  String sex;     //性别
  String birthDate; //生日
  String phoneNumber; //电话号码
  int status; //客户状态(1:正常,2:不正常)
  static String version = "1.0";
  public Customer(){
  }
  public void eat(){
     System.out.println(this.name + " eating...");
  }
  public static void pay(){
    System.out.println(" paying...");
  }
  public String getName(){
    return name;
  }
  public void setName(String name){
    this.name = name;
  }
}


步骤 12 Application.java

import static tool.StringUtil.*;
import entity.*;
import tool.*;
public class Application {
   public static void main(String[] args){
    newLine("******欢迎使用兔子餐厅会员系统******");
    Customer c1 = new Customer();
    c1.setName("鲁班七号" );
    Customer c2 = new Customer();
    c2.setName("后裔");
    Customer c3 = new Customer();
    c3.setName("马克波罗");
    TuziLinkedList list = new TuziLinkedList();
    list.add(c1);
    list.add(c2);
    list.add(c3);
    list.display();
   }
}

最后,奉上视频讲解:https://www.bilibili.com/video/BV1ZP4y1h7pr/

相关文章
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
90 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
2月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
40 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
2月前
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
131 1
|
3月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的反诈视频宣传系统
基于Java+Springboot+Vue开发的反诈视频宣传系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的反诈视频宣传管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
77 4
基于Java+Springboot+Vue开发的反诈视频宣传系统
|
2月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
129 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
2月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
85 2
|
2月前
|
算法 Java Linux
java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
这篇文章介绍了如何在Java中使用Graphics2D在图片上绘制文字,并实现自动换行的功能。
134 0
|
2月前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
30 0
|
4月前
|
设计模式 缓存 算法
揭秘策略模式:如何用Java设计模式轻松切换算法?
【8月更文挑战第30天】设计模式是解决软件开发中特定问题的可重用方案。其中,策略模式是一种常用的行为型模式,允许在运行时选择算法行为。它通过定义一系列可互换的算法来封装具体的实现,使算法的变化与客户端分离。例如,在电商系统中,可以通过定义 `DiscountStrategy` 接口和多种折扣策略类(如 `FidelityDiscount`、`BulkDiscount` 和 `NoDiscount`),在运行时动态切换不同的折扣逻辑。这样,`ShoppingCart` 类无需关心具体折扣计算细节,只需设置不同的策略即可实现灵活的价格计算,符合开闭原则并提高代码的可维护性和扩展性。
66 2
|
7天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。