返回

JavaScript 版数据结构之链表:剖析特性,巧妙运用

前端

揭秘 JavaScript 版数据结构之链表:功能强大,灵活多变

引子:

在计算机科学浩瀚的海洋中,数据结构犹如航海图,指引着程序员探索数据的奥秘。在众多数据结构中,链表因其灵活性、插入和删除的便利性,而成为一种不可忽视的存在。如今,JavaScript 作为一种强大的语言,为链表的实现提供了广阔的舞台。

剖析链表的本质:

链表是一种非连续、非顺序的存储结构,它以指针链接的方式构建数据元素之间的逻辑顺序。每个结点包含两个基本元素:数据域和指针域。数据域存储实际数据,而指针域指向下一个结点,从而建立起链表的链式结构。

JavaScript 中的链表实现:

JavaScript 是一门基于对象的语言,因此链表的实现可以基于对象。我们可以定义一个结点类,包含数据和 next 属性,其中 next 属性指向下一个结点:

class Node {
  constructor(data) {
    this.data = data;
    this.next = null;
  }
}

链表操作的奥秘:

链表的魅力在于其高效的插入和删除操作。

  • 插入: 可以在链表的头部、尾部或任意位置插入新结点。例如,在头部插入新结点:
insertAtHead(newNode) {
  newNode.next = this.head;
  this.head = newNode;
}
  • 删除: 根据结点的数据或索引删除指定结点。例如,删除尾部结点:
deleteAtTail() {
  let current = this.head;
  let prev = null;

  while (current.next) {
    prev = current;
    current = current.next;
  }

  if (!prev) {
    this.head = null;
  } else {
    prev.next = null;
  }
}

实战:LeetCode 链表题目演练:

  1. 两数相加: 将两个链表表示的非负整数相加,返回表示和的链表。
var addTwoNumbers = function(l1, l2) {
  let dummy = new Node(0);
  let current = dummy;
  let carry = 0;

  while (l1 || l2 || carry) {
    let sum = (l1 ? l1.data : 0) + (l2 ? l2.data : 0) + carry;
    carry = Math.floor(sum / 10);
    current.next = new Node(sum % 10);
    current = current.next;
    l1 = l1 ? l1.next : null;
    l2 = l2 ? l2.next : null;
  }

  return dummy.next;
};
  1. 反转链表: 将给定的链表反转,返回反转后的链表。
var reverseList = function(head) {
  let prev = null;
  let current = head;

  while (current) {
    let next = current.next;
    current.next = prev;
    prev = current;
    current = next;
  }

  return prev;
};
  1. 删除链表中的重复元素: 给定一个链表,删除所有重复的元素,只保留一个。
var deleteDuplicates = function(head) {
  if (!head) {
    return null;
  }

  let dummy = new Node(0);
  dummy.next = head;
  let current = head;
  let prev = dummy;

  while (current) {
    if (current.data === prev.data) {
      prev.next = current.next;
    } else {
      prev = current;
    }
    current = current.next;
  }

  return dummy.next;
};

结语:

链表是 JavaScript 数据结构库中的宝贵财富,它凭借其灵活性、高效的插入和删除操作,成为解决各种问题的利器。通过理解链表的本质、操作和实战演练,开发者可以熟练运用这一数据结构,为构建更强大的应用程序奠定坚实的基础。