返回

并非那样复杂:十分钟入门链表(附 LeetCode 刷题攻略)

前端

当说到数据结构和算法时,许多人都会想到数组。毕竟,它是如此简单易懂,在编程语言中也随处可见。然而,当我们遇到更复杂的数据结构时,链表无疑是绕不开的一个坎。

链表相对于数组来说,确实要复杂的多。因为它不是由连续的内存空间组成,而是由一组零散的内存块透过指针连接而成。因此,每一个块中不仅包含当前节点的内容,还包含了指向后继节点的指针。最常见的链表类型有单链表、双链表以及循环链表。

追加节点

在链表中添加新节点非常简单。只需要创建一个新节点,并将新节点的指针指向链表的最后一个节点即可。如果链表是空的,则新节点既是链表的头节点也是尾节点。

Node* append(Node* head, int data) {
  Node* new_node = new Node(data);

  if (head == NULL) {
    return new_node;
  }

  Node* current = head;
  while (current->next != NULL) {
    current = current->next;
  }

  current->next = new_node;

  return head;
}

查找

在链表中查找一个节点也相对简单。只需要遍历链表,并比较每个节点的值与要查找的值是否相等即可。如果找到匹配的节点,则返回该节点;否则,返回NULL。

Node* find(Node* head, int data) {
  Node* current = head;

  while (current != NULL) {
    if (current->data == data) {
      return current;
    }

    current = current->next;
  }

  return NULL;
}

在指定位置插入

在链表的指定位置插入一个新节点稍微复杂一些。需要先找到要插入节点位置的前一个节点,然后将新节点插入到该节点之后。如果要插入的位置是链表的开头,则新节点成为链表的头节点。

Node* insert(Node* head, int data, int position) {
  Node* new_node = new Node(data);

  if (position == 0) {
    new_node->next = head;
    return new_node;
  }

  Node* current = head;
  for (int i = 0; i < position - 1; i++) {
    current = current->next;
  }

  new_node->next = current->next;
  current->next = new_node;

  return head;
}

链表的应用

链表在计算机科学中有着广泛的应用,例如:

  • 栈和队列
  • 散列表
  • 图形
  • 编译器
  • 操作系统

LeetCode 刷题攻略

对于想要掌握链表的同学来说,LeetCode 上有很多与链表相关的题目可以练习。这里提供一些刷题建议:

  • 从简单题开始,逐渐挑战更难的题目。
  • 不要害怕失败,失败是学习过程的一部分。
  • 多种刷题,不要只局限于一种解法。
  • 多思考,多总结,积累经验。

结语

链表是数据结构和算法中非常重要的一个知识点。希望通过本文的讲解和 LeetCode 刷题攻略,能够帮助大家入门链表。