解法1:迭代
思路:在遍历链表时,将当前节点的next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回最后一个结点
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == nullptr || head->next == nullptr) return head;
ListNode *pre = head->next, *post = head, *tmp;
head->next = nullptr;
while (pre != nullptr) {
tmp = pre->next; //存后面的结点
pre->next = post;
post = pre;
pre = tmp;
}
return post;
}
};
解法2:递归
class Solution {
public:
ListNode* digui(ListNode* node, ListNode* &Head);
ListNode* reverseList(ListNode* head) {
if (head == nullptr || head->next == nullptr) return head;
ListNode* Head;
digui(head, Head)->next = nullptr;
return Head;
}
};
ListNode* Solution::digui(ListNode* node, ListNode* &Head) {
if (node->next == nullptr) {
Head = node;
return node;
}
digui(node->next, Head)->next = node;
return node;
}