方法一:递归:时间O(n),空间O(n)
题解:回溯的时候将每个节点的下一个节点的指针域指向当前节点,并且把当前节点的next指针域设置为空
- 当前节点next指针域不为空则进行递归,否则返回当前节点
- 在回溯的时候将每个节点的next->next指向当前节点,并把当前节点next置空防止环形链表
- 返回新的头结点
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head)
{
// 1.递归:在回溯的时候将返回的节点的next指向cur
if (!head || !head->next)
return head;
ListNode* newhead = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return newhead;
}
};
方法二:迭代:时间O(n),空间O(1)
题解:双指针,一个操作反转,一个操作断开的链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head)
{
// 2.常规操作,双指针,一个操作反转,一个操作断开的链表
if (head == nullptr)
return head;
ListNode* p = head;
ListNode* pre = p->next;
p->next = nullptr;
while (pre)
{
p = pre;
pre = pre->next;
p->next = head;
head = p;
}
return head;
}
};