链表第一课

作者: 学习编程王同学 | 来源:发表于2018-08-04 09:34 被阅读95次

链表是一种基础的数据结构,它表示一列元素。

链表由节点(Node)组成,一个节点包含两个变量,一个变量存储我们需要保存的数据(图中的item),另一个变量指向下一个节点(图中的next),如下图所示:

节点

在程序中表示如下:

private class Node
{
    Item item;    // 保存数据
    Node next;   // 指向下一个节点
}

若干个这样的节点一个一个连起来,就可以组成一个链表。此外,我们还需要两个变量,分别指向链表的头节点和尾节点:本文使用first变量指向头节点,last变量指向尾节点。

下面介绍四个链表的操作:

  • 创建第一个节点。
  • 在表头添加节点。
  • 在表尾添加节点。
  • 在表头删除节点。

创建第一个节点

创建第一个节点非常容易,只需要新建一个节点,并将变量first和last都指向这个节点即可:

创建第一个节点

这个节点的next变量为null(空),意味着它不指向其他节点,也就是说它是最后一个节点。它还是第一个节点,所以last和first变量都指向它。

这个节点的item变量被赋值为boy,这是我们希望存储的数据。

在表头添加节点

在表头添加节点需要使用一个临时变量,这里把这个临时变量叫做oldfirst,它指向添加新节点之前的头节点。

在表头添加节点的过程如下:

  • 将oldfirst变量指向头节点;
  • 新建一个节点并将first变量指向它;
  • 将新节点的next变量指向oldfirst变量所指的节点。

这样,新建的节点成了整个链表的头节点,而原先的头节点成了链表的第二个节点。如下图:

在表头添加节点

至此,我们得到了一条拥有两个节点的链表:

拥有两个节点的链表

在表尾添加节点

在表尾添加节点和在表头添加节点非常相似,过程如下:

  • 将oldlast变量指向尾节点;
  • 新建一个节点并将last变量指向他;
  • 将oldlast变量所指节点的next变量指向新节点。
在表尾添加节点

这样,新添加的节点变成了尾节点,原先的尾节点变成了倒数第二个节点。

至此,我们拥有了一条由三个节点构成的链表:

拥有三个节点的链表

在表头删除节点

在表头删除节点很简单,只需要将first变量指向第二个节点(头节点next变量所指的节点),然后让原先的头节点随风而去即可:

在表头删除节点

至此,链表的四种基本操作就介绍完了。

数组也可以用于保存一列元素,它们之间的主要区别有:

功能 数组 链表
随机访问和修改任意元素 可以,可以通过下标访问 不可以,只能从头节点一个一个往后寻找
不移动其他元素在内存中的位置的情况下插入元素 不可以 可以
事先估计元素容量 需要,因为数组元素个数一旦确定,便无法再更改 不需要
所需空间与元素容量成正比 一般不是,需要为添加和插入元素预留空间

链表一个典型的应用是在栈(LIFO)和队列(FIFO)中,栈使用后进先出的策略,在表头添加节点,在表头删除节点;队列使用先进先出的策略,在表头添加节点,在表尾删除节点。

相关文章

  • 链表第一课

    链表是一种基础的数据结构,它表示一列元素。 链表由节点(Node)组成,一个节点包含两个变量,一个变量存储我们需要...

  • 链表基础

    链表基础 链表长度 链表为空 链表结构 链表增加

  • 双向链表&双向循环链表

    链表分为:单链表、单向循环链表、双向链表、双向循环链表本节主要说明:双向链表、双向循环链表 定义结点 一、双向链表...

  • 算法与数据结构:链表

    链表 链表还分为单向链表和双向链表, 但是这篇文章只说单向链表 , 下次再讲双向链表 . 链表和数组的区别 ? 链...

  • 链表

    链表 单链表反转链表中环的检测两个有序链表合并删除链表倒数第n个节点求链表的元素总个数 一.单向链表 链表共有特征...

  • 五、双向链表

    双向链表 此前介绍的链表,也叫做单向链表使用双向链表可以提升链表的综合性能 修改之前的单链表的源码: 双向链表 –...

  • 链表

    内容 链表数据结构 向链表添加元素 从链表移除元素 使用 LinkedList 表 双向链表 循环链表 链表数据结...

  • 数据与算法结构

    线性表 顺序表 链表(物理上离散,逻辑上连续) 链表的类别 单链表 循环链表 双链表 链表的操作 顺序表与链表的比...

  • 数据结构——链表

    本文所讲的链表是单链表,链表采用无头链表 科普下:一般链表可以分为有头节点的链表与无头节点的链表 有头节点的链表:...

  • 链表

    文章结构 链表的定义 链表的插入和删除操作 链表的特性 常见的链表结构 自定义链表 链表的经典操作 使用链表实现L...

网友评论

  • 御史神风:文章很干练,不过作为第一课,要是再在宏观上讲一下链表的概念就更好啦
    学习编程王同学:@御史神风 谢谢,已经更改。在文末添加了数组和链表一些特点的比较,感谢。
    御史神风:@mwangjs 比如指介绍下如链表的大小可伸缩,节点插入很方便这些特性。就是说说链表有什么特点。
    学习编程王同学:@御史神风 谢谢。您说的宏观上介绍是指?

本文标题:链表第一课

本文链接:https://www.haomeiwen.com/subject/yjbpvftx.html