TypeScript数据结构链表结构 LinkedList教程及面试

yizhihongxing

TypeScript数据结构链表结构 LinkedList教程及面试攻略

在程序设计中,链表是一种重要的数据结构,它可以用来存储一系列数据元素,并提供一些类似于数组的操作。 TypeScript是一种JavaScript的超集,它提供了更加丰富的类型系统,使得我们可以更好的使用链表这种数据结构。

本文将会讲解使用TypeScript实现常见的链表结构,并且提供一些关于LinkedList类型的常见面试题目。在讲解具体实现之前,我们先来了解链表的基础知识。

什么是链表?

链表是一种线性数据结构。它由多个节点组成,每个节点包含两个属性:数据和指向下一个节点的指针。通过这种指针的方式,链表将多个节点串联起来,从而形成一个有序的序列。

链表和数组有什么区别?

相比于数组,链表一般不支持随机访问。也就是说,我们无法像数组一样通过下标访问单个元素,而是要从头开始依次遍历节点。

但是,链表有一个优点,那就是支持高效的插入与删除操作。因为链表只需要改变相关的指针即可完成插入和删除操作,而不需要像数组一样将后面的元素向后移位。

实现LinkedList

在TypeScript中,我们可以使用class来实现链表。下面是实现一个简单的单向链表的代码:

class ListNode<T> {
  public next: ListNode<T> | null = null;
  constructor(public data: T) {}
}

class LinkedList<T> {
  public head: ListNode<T> | null = null;

  push(data: T) {
    const node = new ListNode(data);
    if (!this.head) {
      this.head = node;
      return;
    }

    let tail = this.head;
    while(tail.next) {
      tail = tail.next;
    }
    tail.next = node;
  }

  insert(data: T, index: number) {
    if (!this.head || index === 0) {
      const newHead = new ListNode(data);
      newHead.next = this.head;
      this.head = newHead;
      return;
    }

    let listNode = this.head;
    while(listNode.next && index > 1) {
      listNode = listNode.next;
      index--;
    }
    const newNode = new ListNode(data);
    newNode.next = listNode.next;
    listNode.next = newNode;
  }

  get(index: number): T|undefined {
    if (!this.head) {
      return undefined;
    }

    let listNode = this.head;
    while(listNode && index > 0) {
      listNode = listNode.next;
      index--;
    }

    if (listNode) {
      return listNode.data;
    }

    return undefined;
  }

  delete(index: number) {
    if (!this.head) {
      return;
    }

    if (index === 0) {
      this.head = this.head.next;
      return;
    }

    let listNode = this.head;

    while(listNode.next && index > 1) {
      listNode = listNode.next;
      index--;
    }

    if (listNode.next) {
      listNode.next = listNode.next.next;
    }
  }

  toArray(): T[] {
    const array = [];
    let listNode = this.head;
    while(listNode) {
      array.push(listNode.data);
      listNode = listNode.next;
    }
    return array;
  }

  size(): number {
    let count = 0;
    let listNode = this.head;
    while(listNode) {
      count++;
      listNode = listNode.next;
    }
    return count;
  }
}

如上面的代码所示,LinkedList类定义了4个常见的操作函数:pushinsertgetdelete,以及两个能够获取链表大小和导出链表数组的函数。

面试题目攻略

面试题目1

如何找到链表中间的节点?

解决思路:定义两个指针,两个指针的速度不同,从链表头部开始同时向后移动,当速度较快的指针到达链表末尾时,速度较慢的指针就处于链表中间节点的位置。

function findMiddle<T>(list: LinkedList<T>): ListNode<T> | null {
  let slow = list.head;
  let fast = list.head;
  while (fast && fast.next) {
    slow = slow!.next;
    fast = fast.next!.next;
  }
  return slow;
}

面试题目2

如何检测链表是否有环?

解决思路:定义两个指针,两个指针的速度不同,从链表头部开始同时向后移动,如果两个指针相遇,那么链表就有环。

function hasCycle<T>(list: LinkedList<T>): boolean {
  let slow = list.head;
  let fast = list.head;

  while (fast && fast.next) {
    slow = slow!.next;
    fast = fast.next!.next;

    if (slow === fast) {
      return true;
    }
  }

  return false;
}

以上就是LinkedList的基础教程和面试攻略的详细说明。如果想要深入了解链表这一数据结构,可以继续学习双向链表、循环链表等其他类型的链表。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:TypeScript数据结构链表结构 LinkedList教程及面试 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C语言编程数据结构线性表之顺序表和链表原理分析

    C语言编程数据结构线性表之顺序表和链表原理分析 线性表的定义 线性表是由n(n>=0)个数据元素a1、a2、…、an组成的有限序列,通常用(a1, a2, …, an)表示,其中a1是线性表的第一个元素,an是线性表的最后一个元素。线性表中的元素个数n称为线性表的长度,当n=0时,线性表为空表。 线性表的分类 根据存储结构,线性表可以分为顺序表…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构之链表的实现

    JavaScript数据结构之链表的实现 什么是链表 链表是一种线性数据结构,其中的元素在内存中不连续地存储,每个元素通常由一个存储元素本身的节点和一个指向下一个元素的引用组成。相比较于数组,链表具有如下优缺点: 优点:动态地添加或删除元素时,无需移动其它元素。(数组则需要移动其它元素) 缺点:不能随机地访问某个元素,必须从头开始顺序遍历。(而数组可以通过索…

    数据结构 2023年5月17日
    00
  • C++数据结构哈希表详解

    C++数据结构哈希表详解 哈希表(Hash Table)是一种非常重要的数据结构,用于实现字典等各种应用。哈希表将关键字映射到一个固定大小的数据集合中,以支持常数时间复杂度的插入、查找和删除操作。哈希表的核心思想是将关键字通过哈希函数(Hash Function)映射到数据集合中的一个索引位置,哈希函数需要满足良好的散列性质,使得关键字能够均匀地散布在数据集…

    数据结构 2023年5月17日
    00
  • 【ACM算法竞赛日常训练】DAY10题解与分析【月月给华华出题】【华华给月月出题】| 筛法 | 欧拉函数 | 数论

    DAY10共2题: 月月给华华出题 华华给月月出题 难度较大。 ? 作者:Eriktse? 简介:211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 原文链接(阅读原文获得更好阅读体验):https://www.eriktse.com/algorithm/110…

    算法与数据结构 2023年4月17日
    00
  • JavaScript数据结构之栈实例用法

    JavaScript数据结构之栈实例用法 本文将会介绍栈在JavaScript中的实例用法以及栈作为一种数据结构的基本概念。 栈的定义 栈是一种遵从后进先出(LIFO)原则的有序集合。新添加或待删除的元素都保存在栈的同一端,称作栈顶,另一端称作栈底,不含任何元素的栈称为空栈。 栈的应用场景 栈其应用场景是非常广泛的。在现实世界中,许多普通的场景都可以使用栈作…

    数据结构 2023年5月17日
    00
  • 自学1

    Problem1 明明的随机数 ## 题目描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 N 个 1 到 1000 之间的随机整数 (N <= 100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“…

    算法与数据结构 2023年4月24日
    00
  • 一、对系统理论的认识

           经过一周的时间学习,我们知道了系统的定义:是一个由一组相互连接的要素构成的,能够实现某个目标的整体,任何一个系统都包括三种构成要件:要素连接,功能或目标。       1.系统的连接使得系统呈现特定的结构,使得系统的各个部件连接而产生系统特有的功能—相关性导新功能涌现。连接的媒介—“三流”(信息流,能量流,物质流)。       2.系统的静态…

    算法与数据结构 2023年4月18日
    00
  • java数据结构基础:稀疏数组

    Java数据结构基础:稀疏数组 在开发过程中,我们需要处理一些稀疏矩阵(大部分元素为0)的数据。这时候,使用稀疏数组是比较高效的方法。 什么是稀疏数组 稀疏数组是由很多元素值相同的元素组成,这些元素的值通常为0。而这些值不同时都存储在一个数组中会浪费很多内存空间。因此,我们使用稀疏数组来存储这些元素。 稀疏数组的定义: 稀疏数组的行数可以理解为矩阵的行数,而…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部