思路一:迭代
遍历链表,逐步反转每个节点的指针方向
cpp
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head == nullptr){
return nullptr;
}
ListNode* front = nullptr;//用于保存反转链表过程中的前驱节点,初始为空
ListNode* current = head;//用于保存当前节点,初始为头节点
//遍历链表
while(current != nullptr){
// 保存当前节点的下一个节点,防止丢失链表后续部分
ListNode* next = current->next;
//反转链表,使当前节点的后继为之前的前驱
current->next = front;
//更新前驱
front = current;
//更新当前节点
current = next;
}
//返回反转链表的头结点
return front;
}
};
- 时间复杂度:O(N)
- 空间复杂度:O(1)
思路二:递归
不断递归调用该函数,使当前节点的后继的后继为当前节点
例如:1 - > 2 - > 3 - > 4
当 当前节点为 1 时,我们需要先反转链表的一部分1 - > 2
此时需要将 2 的后继修改为1 ,对应代码head->next->next = head;
同时需要将1 - > 2 之间断开,对应代码head->next = nullptr;
cpp
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head == nullptr){
return nullptr;
}
if(head->next == nullptr){
return head;
}
ListNode* newHead = reverseList(head->next);
head->next->next = head;//使当前节点的后继的后继为当前节点
head->next = nullptr;//断链
//返回反转链表的头结点
return newHead;
}
};
- 时间复杂度:O(N)
- 空间复杂度:O(N)