📅  最后修改于: 2023-12-03 15:26:09.556000             🧑  作者: Mango
链表问题5是关于链表反转的问题,即将原链表中的元素顺序颠倒并返回一个新链表。
给出一个链表,对其进行反转操作。例如,对于链表 1->2->3->4->5
转换后变成 5->4->3->2->1
。
反转链表的一般做法是用三个指针依次遍历链表,分别指向当前节点、当前节点的前一个节点和后一个节点。在遍历的过程中,将当前节点的指针指向前一个节点,然后更新指针位置。当遍历到链表末尾时,前一个节点就是反转后的链表的头节点。
具体的实现步骤如下:
prev
、curr
和 next
分别表示前一个节点、当前节点和后一个节点。初始化时 prev
为 NULL
,curr
为链表的头节点,next
为 curr->next
前进一步;prev
。下面是具体的代码实现:
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* reverseList(ListNode* head) {
ListNode *prev = NULL, *curr = head, *next;
while (curr != NULL) {
next = curr->next; // 保存当前节点的下一个节点
curr->next = prev; // 当前节点指向前一个节点
prev = curr; // 前一个节点指针前移
curr = next; // 当前节点指针前移
}
return prev; // 返回新的头节点
}
int main() {
ListNode *head = new ListNode(1);
head->next = new ListNode(2);
head->next->next = new ListNode(3);
head->next->next->next = new ListNode(4);
head->next->next->next->next = new ListNode(5);
head = reverseList(head);
ListNode *curr = head;
while (curr != NULL) {
cout << curr->val << " ";
curr = curr->next;
}
cout << endl;
return 0;
}
反转链表的时间复杂度为 $O(n)$,其中 $n$ 表示链表中节点的个数。
反转链表的空间复杂度为 $O(1)$,即只需要常数的额外空间来保存链表中的节点指针。