链表初探-遍历链表

简介: 链表是一种数据结构。

前言


链表是一种数据结构。在链表中有几个重要的概念:


一个链表对象的结构可能是这样的:


const linkedList = {
  head: {
    value: 'A',
    next: {
      value: 'B',
      next: null
    }
  }
}


这是一个单项链表


关键字 描述
node 节点
head 头节点,第一个节点
tail 尾节点,最后一个节点
prev 一般指代存储了上一个节点的引用
next 一般指代存储了下一个节点的引用
current 一般指代链表的当前节点
value 当前节点的值


单向链表与双向链表:


  • 单向链表:节点上会有一个next属性指向下一个节点


  • 双向链表:节点上会有一个next属性指向下一个节点,同时有一个属性prev指向上一个节点


链表类


// 定义链表节点类型
interface LinkedListNode {
  value: number;
  next: LinkedListNode | null;
}
// 定义链表类
class LinkedList {
  // 表示头节点
  private head: LinkedListNode | null = null;
  // 表示尾节点
  private tail: LinkedListNode | null = null;
  // 用来表示链表的长度
  private len: number = 0;
  /**
   * @method add
   * @description 添加链表元素,添加到链表末尾位置
   * @param n number
   */
  add(n: number) {
    // 生成链表节点
    const node: LinkedListNode = {
      value: n,
      next: null,
    };
    // head节点特殊处理
    if (this.head === null) {
      this.head = node;
    }
    // 获取当前tail节点
    const tailNode = this.tail;
    // 当前tail节点存在,则将next指针,指向node
    if (tailNode) {
      tailNode.next = node;
    }
    // 更新tail节点的指向
    this.tail = node;
    // 注意,这里链表长度单独计算的,长度+1
    this.len++;
  }
  /**
   * @method map
   * @description 遍历链表所有的元素 - 从头到尾
   * @returns number[] 链表所有节点的值
   */
  map(): number[] {
    // 存储
    let res: number[] = [];
    // 初始指向head节点
    let currentNode = this.head;
    // 当前currentNode节点存在,进入循环
    while (currentNode) {
      // 当前节点的值
      res.push(currentNode.value);
      // 将当前节点的指针,指向
      currentNode = currentNode.next;
    }
    // 返回结果
    return res;
  }
  /**
   * @description 返回链表的长度
   */
  get length() {
    return this.len;
  }
}


当前链表类,定义的是一个单向链表,可以在这个基础上,思考下双向链表是如何实现的。


创建链表对象


通过链表类,创建一个链表对象,并执行链表节点添加


// 实例化创建链表对象
const linkedList = new LinkedList();
// 依次添加元素
linkedList.add(1);
linkedList.add(2);
linkedList.add(3);
linkedList.add(4);
linkedList.add(5);
// 遍历链表对象
console.log(linkedList.map()); // [1, 2, 3, 4, 5]


小课堂


通过该篇文章我们了解了链表以及单向和双向链表,还有链表类的定义,遍历链表元素。在下一篇文章中我们来研究下如何反转链表


相关文章
|
5月前
|
存储
链表的遍历方式
链表的遍历方式
|
6月前
|
存储 算法
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
72 0
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
|
7月前
双链表的插入,删除以及遍历
双链表的插入,删除以及遍历
50 6
链表遍历,链表查找和统计节点,链表插入新节点,链表删除节点,链表修改指定节点,链表头插法,尾插法总结
链表遍历,链表查找和统计节点,链表插入新节点,链表删除节点,链表修改指定节点,链表头插法,尾插法总结
|
7月前
|
算法 Python Java
Java每日一练(20230429) 二叉树后序遍历、删除无效括号、合并有序链表
Java每日一练(20230429) 二叉树后序遍历、删除无效括号、合并有序链表
48 0
Java每日一练(20230429) 二叉树后序遍历、删除无效括号、合并有序链表
|
7月前
|
算法 Java C++
Java每日一练(20230424) 二叉树中序遍历、交换链表节点、不同子序列
Java每日一练(20230424) 二叉树中序遍历、交换链表节点、不同子序列
63 0
Java每日一练(20230424) 二叉树中序遍历、交换链表节点、不同子序列
|
7月前
|
Go Java C++
Java每日一练(20230409) 多数元素、反转链表 II 、日期之间的遍历
Java每日一练(20230409) 多数元素、反转链表 II 、日期之间的遍历
54 0
Java每日一练(20230409) 多数元素、反转链表 II 、日期之间的遍历
|
C++
数据结构循环链表之循环链表遍历 | 第三套
数据结构循环链表之循环链表遍历 | 第三套
39 0
|
存储 C++
链表操作:插入、删除与遍历
(笔者画图不易呜呜)链表是一种基本的数据结构,它可以用来存储一系列的元素,并且支持灵活的插入、删除操作。在计算机科学中,链表常常用于构建更复杂的数据结构,如栈、队列以及图等。
341 0
|
Java
java数据结构20:Big Bang(链表的插入、删除、遍历和查找)
学习累了的时候看看一集二十分钟左右的《生活大爆炸》也不失为一种乐趣。在剧中Sheldon可以说是一个极品,真不知Leonard是如何忍受这位极品室友成天的唠叨。
100 0