返回

前端算法实战|链表基础操作篇

前端

前言

链表是一种常见的线性数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表在前端开发中非常有用,它可以用来实现各种数据结构,例如栈、队列、哈希表等。

本文将介绍链表的基础操作,包括链表的合并、链表的删除以及链表删除的延申。这些操作都是前端工程师必须掌握的基本技能。

链表的合并

链表的合并是指将两个有序链表合并成一个有序链表。合并后的链表依然有序,并且包含两个原链表的所有元素。

链表的合并可以通过递归或者迭代的方式来实现。这里我们介绍递归的方式。

/**
 * 合并两个有序链表
 *
 * @param {ListNode} l1 第一个链表
 * @param {ListNode} l2 第二个链表
 * @return {ListNode} 合并后的链表
 */
const mergeTwoLists = (l1, l2) => {
  if (l1 === null) {
    return l2;
  }
  if (l2 === null) {
    return l1;
  }

  if (l1.val < l2.val) {
    l1.next = mergeTwoLists(l1.next, l2);
    return l1;
  } else {
    l2.next = mergeTwoLists(l1, l2.next);
    return l2;
  }
};

链表的删除

链表的删除是指从链表中删除一个指定的节点。

链表的删除可以通过迭代或者递归的方式来实现。这里我们介绍迭代的方式。

/**
 * 从链表中删除一个指定的节点
 *
 * @param {ListNode} head 链表的头节点
 * @param {ListNode} node 要删除的节点
 * @return {ListNode} 删除后的链表
 */
const deleteNode = (head, node) => {
  if (head === null || node === null) {
    return head;
  }

  if (node === head) {
    return head.next;
  }

  ListNode prev = null;
  ListNode current = head;

  while (current !== null) {
    if (current === node) {
      prev.next = current.next;
      break;
    }

    prev = current;
    current = current.next;
  }

  return head;
};

链表删除的延申

链表删除的延申是指从链表中删除一个范围内的节点。

链表删除的延申可以通过迭代或者递归的方式来实现。这里我们介绍迭代的方式。

/**
 * 从链表中删除一个范围内的节点
 *
 * @param {ListNode} head 链表的头节点
 * @param {number} start 开始位置
 * @param {number} end 结束位置
 * @return {ListNode} 删除后的链表
 */
const deleteRange = (head, start, end) => {
  if (head === null || start < 1 || end < start) {
    return head;
  }

  ListNode prev = null;
  ListNode current = head;

  while (current !== null) {
    if (start === 1) {
      head = current.next;
      start++;
    } else if (start > 1) {
      prev.next = current.next;
      start++;
    }

    if (end === start) {
      prev.next = current.next;
      break;
    }

    prev = current;
    current = current.next;
  }

  return head;
};

总结

链表是一种常见的数据结构,它在前端开发中非常有用。本文介绍了链表的基础操作,包括链表的合并、链表的删除以及链表删除的延申。这些操作都是前端工程师必须掌握的基本技能。