反转链表(18min)
1.双指针法
p->q->r
想的也是多个指针移动,修改next,实际操作发现,只有两个是不够的,还需要一个r保存q原来的下一个元素
还是考虑链表为空和只有一个元素的特殊情况
/**
* 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 || head->next == nullptr) {
return head;
}
ListNode* p = head;
ListNode* q = head->next;
ListNode* r = q->next;
q->next = p;
p->next = nullptr;
p = q;
q = r;
while (r != nullptr) {
r= q->next;
q->next = p;
p = q;
q = r;
}
return p;
}
};
2.递归:
递归函数的参数包含了两个值(p,q)
注意递归结束条件(注释为错误案例)
/**
* 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* reverse(ListNode* p, ListNode* q) {
// if (q->next == nullptr) {
// return q;
// }
if (q == nullptr) {
return p;
}
ListNode* r = q->next;
q->next = p;
return reverse(q, r);
}
ListNode* reverseList(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return head;
}
ListNode* p = reverse(head, head->next);
head->next = nullptr;
return p;
}
};