206. 反转链表
这题也不难,就是我被有个地方坑住了,就是最初的prev我还单独开了一块空间并且赋值了,后来我发现直接赋值为nullptr不就好了吗。
还有递归,可能是经验不足,一直在想怎么用题目给的函数(只有一个参数)来完成,结果后面发现是自己再单独写函数,向右多少个参数都行。
具体的逻辑就是在进入下一节迭代或递归前传入当前值和上一次的值(即cur和cur-next)。然后每一次把当前值的next变为prev即可。
迭代的方法:
/**
* 迭代的方法:设立四个变量,一个代表当前节点cur,一个代表当前节点的下一个节点next,
* 一个代表当前节点的上一个节点prev,先用next保存cur的下一个节点,然后使cur的下一个节点变为
* prev,再用prev保存当前节点。然后cur变为next。
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* curNode = head;
ListNode* nextNode;
ListNode* prevNode = nullptr;
while (curNode != nullptr) {
nextNode = curNode->next;
curNode->next = prevNode;
prevNode = curNode;
curNode = nextNode;
}
return prevNode;
}
};
递归的方法:
/**
* 递归的方法:和迭代是一样的,每次递归传入当前值和前一个值,如果当前值为null,返回前一个值。
*/
class Solution {
public:
ListNode* reverse(ListNode* prev, ListNode* cur) {
if (cur == nullptr)
return prev;
ListNode* temp = cur->next;
cur->next = prev;
return reverse(cur, temp);
}
ListNode* reverseList(ListNode* head) {
return reverse(nullptr, head);
}
};