返回

环形链表:数据结构的链式存储之美

前端

1. 链表的基本概念

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据域和一个指向下一个节点的指针域。链表中的节点可以动态地增加或减少,因此链表是一种非常灵活的数据结构。

链表按存储结构划分为四种:顺序存储、链式存储、索引存储和散列存储。按元素之间前后关系划分为两种:线性结构和非线性结构。

2. 环形链表的原理

环形链表是一种特殊的链表,它将链表的尾节点指向头节点,形成一个环状结构。环形链表中,每个节点都有一个数据域和一个指向下一个节点的指针域,最后一个节点的指针域指向头节点。

环形链表的优势在于,它可以有效地利用内存空间,并且可以在常数时间内访问链表中的任何一个节点。但是,环形链表也有一个缺点,那就是如果链表中存在环,则无法通过指针域找到链表的尾节点。

3. 环形链表的实现

环形链表的实现非常简单,只需要在创建链表时将尾节点的指针域指向头节点即可。以下是用C++实现的环形链表:

struct Node {
  int data;
  Node* next;
};

class CircularLinkedList {
public:
  CircularLinkedList() {
    head = nullptr;
    tail = nullptr;
  }

  void addNode(int data) {
    Node* newNode = new Node{data, nullptr};
    if (head == nullptr) {
      head = newNode;
      tail = newNode;
      tail->next = head;
    } else {
      tail->next = newNode;
      tail = newNode;
      tail->next = head;
    }
  }

  void deleteNode(int data) {
    Node* current = head;
    Node* previous = nullptr;
    while (current != nullptr && current->data != data) {
      previous = current;
      current = current->next;
    }

    if (current == nullptr) {
      return;
    }

    if (current == head) {
      head = head->next;
      tail->next = head;
    } else if (current == tail) {
      tail = previous;
      tail->next = head;
    } else {
      previous->next = current->next;
    }

    delete current;
  }

  void printList() {
    Node* current = head;
    while (current != nullptr) {
      std::cout << current->data << " ";
      current = current->next;
      if (current == head) {
        break;
      }
    }

    std::cout << std::endl;
  }

private:
  Node* head;
  Node* tail;
};

4. 环形链表的优缺点

环形链表具有以下优点:

  • 可以有效地利用内存空间。
  • 可以