返回
每日一题之反转链表 II 的c++解决方案
前端
2024-01-10 19:21:40
反转链表的算法步骤
反转链表的算法步骤如下:
- 初始化两个指针,一个指向当前节点,另一个指向下一个节点。
- 将当前节点的下一个指针指向前一个节点。
- 将当前节点和下一个节点的指针互换。
- 将前一个节点指针移动到当前节点。
- 重复步骤 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++实现链表反转,并提供了一个详细的示例程序来说明如何使用该方法反转链表。通过本文的学习,希望大家能够对链表反转有更深入的了解。