数据结构02:链表(1)

147 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

什么是链表

在上一篇介绍数据结构的文章中,我们简单了解了什么是数据结构。同时也讲解了线性表和顺序表之间的关系及顺序表的一些主要功能。

这篇给各位介绍的是另一常用的数据结构——链表。

链表是一种物理存储单元上非连续、非顺序的存储结构。 在上一篇中,我们讲到顺序表的顺序指的是:元素在内存空间中按地址顺序相邻排列;同理,链表则是一种元素在内存空间中不按地址顺序相邻排列的数据结构

与顺序表相比,链表元素在内存中要更加零散。如图所示:

image.png

链表与同为线性表的顺序表相比,最大的特点便是链表不限制其数据的物理存储地址,换而言之,链表的数据元素其在内存中的物理存储位置是随机的

链表的结构

在实际使用中,我们可以不用去关心链表元素在内存中到底如何存储,我们只需要了解链表的逻辑结构便可以放心大胆地使用链表了。

Node:链表的节点

链表由一个个Node(节点)对象链接构成,链表的元素就作为Node(节点)对象的属性被储存在Node对象里面。而每个Node节点除了要有用以存储值的value属性外还必须要有指明下一个Node对象位置的next属性。

image.png

这样每个Node对象在存储值的同时,也指出了下一个Node对象位置,每个Node对象都会像手链上的珠子一样被“串”在一起,像链条一样。而当我们使用时,只需要有第一个节点(头节点)就可以利用next属性遍历完整条链表了。

Node的实现

按照我们前面的介绍,我们现在就可以来设计实现Node(节点)类了。

public class Node{
    private int value;
    public Node next;
}

首先是Node对象必须要具备的两个属性:用来存储元素的value和用来链接下一节点的next

接下来就是为Node类设计它的方法:

public Node()  // 用来创建头节点的构造器方法
{
    this.value = null;
    this.next = null;
}

public Node(int value)  // 用来创建普通节点的构造器方法
{
    this.value = value;
    this.next = null;
}

两个构造器方法,分别为用来创建链表的头节点普通节点。在单链表中头节点通常不存放数据,这样便于开发者标识该节点是否为链表的第一个节点,同时也可以便捷、统一地判断该链表是否是一个空表。

设计完Node类的创建方法,接下来在为Node类设计“行为”。

public void setValue(int value) // 设置值当前节点值的大小
{
    /*  可以在该方法位置限制 Node节点的值,比如:值最大为5、值最小为3等等
    */
    this.value = value;
}
​
public int getValue()   // 给调用者返回当前节点的值
{
    return this.value;
}
​
public void addNext(Node next)  // 为当前节点添加下一节点位置
{
    this.next = next;
}

这样我们就设计好了一个Node(节点) 对象,我们也将使用这个类来设计我们的List(链表)类

小结

本章主要讲解了链表的特点,以及线性表的链式存储结构的物理结构和逻辑结构。

天天学习,加速成长!

希望与各位一起变得越来越强!