返回

每日一题之反转链表 II 的c++解决方案

前端

反转链表的算法步骤

反转链表的算法步骤如下:

  1. 初始化两个指针,一个指向当前节点,另一个指向下一个节点。
  2. 将当前节点的下一个指针指向前一个节点。
  3. 将当前节点和下一个节点的指针互换。
  4. 将前一个节点指针移动到当前节点。
  5. 重复步骤 2-4,直到到达链表的尾部。

C++实现

// 定义节点结构体
struct Node {
  int val;
  Node* next;
  Node(int val, Node* next) : val(val), next(next) {}
};

// 反转链表
Node* reverseList(Node* head) {
  Node* prev = nullptr;
  Node* curr = head;
  while (curr) {
    Node* next = curr->next;
    curr->next = prev;
    prev = curr;
    curr = next;
  }
  return prev;
}

// 打印链表
void printList(Node* head) {
  while (head) {
    std::cout << head->val << " ";
    head = head->next;
  }
  std::cout << std::endl;
}

// 测试
int main() {
  Node* head = new Node(1, new Node(2, new Node(3, new Node(4, new Node(5, nullptr)))));
  printList(head);
  head = reverseList(head);
  printList(head);
  return 0;
}

复杂度分析

反转链表的时间复杂度为O(n),其中n是链表的长度。这是因为反转链表需要遍历链表中的每个节点一次,并且每次遍历都需要花费O(1)的时间。

反转链表的空间复杂度为O(1),因为该算法不需要额外分配任何空间。

结语

反转链表是一种常见的数据结构操作,在许多编程场景中都有应用。在本文中,我们学习了如何使用C++实现链表反转,并提供了一个详细的示例程序来说明如何使用该方法反转链表。通过本文的学习,希望大家能够对链表反转有更深入的了解。