1 递归法
class Solution {
public:
ListNode* reverseList(ListNode* head) {
//递归用于可以把大问题化成小问题的问题,并且大小问题的性质相同,不断重复的问题。
//为什么要从后面开始反转?若从后面开始反转在前面的结点是可以记住后面的。
if(head == nullptr||head->next == nullptr)
{
return head;
}
ListNode*newList = reverseList(head->next);//当传入的head->next是5时返回,此时的head是4,返回后递归行为结束,再进行下面的算法。继续返回那个第5个即最后一个节点后那时的head是3,继续下面的算法,继续返回newList。继续head减少回去。newList的值始终不变。从头结点1开始一直到结点5才返回这个式子的值。
head->next->next = head;
head->next = nullptr;
return newList;
}
};
2 迭代法
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* next = nullptr;
ListNode* prev = nullptr;
ListNode* curr = head;
while (curr)
{
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
};