如有错误请及时指出,该文章的图片来自于力扣老汤题解,如有侵权问题请及时联系我
解法一:双指针顾名思义就是通过两个指针共同完成工作(某种情况下也可叫做滑动窗口),由于该题是单链表问题(只能单向遍历),所以要借助中间变量next来使双指针滑动
/**
* 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) {
ListNode* p = nullptr;
ListNode* q = head;
while (q) {
ListNode* next = q->next;
q->next = p;
p = q;
q = next;
}
return p;
}
};
解法二:递归。如果采用递归来解题的话,需要考虑递归的三大要素(函数功能,结束条件,等价关系式),还需要考虑三大特点(大问题可拆分成两个子问题,子问题和大问题解法一致,存在最小子问题)
函数功能:反转单链表
结束条件:当尾结点完成操作时即为结束
等价关系:reverseList(head) 等价于 reverseList(head.next) + 改变一下1,2两个节点的指向
可拆分性:可以看作是head与非head结点两部分进行操作
解法一致性:都为结点的next反向修改
存在最小子问题与结束条件相似
/**
* 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 || !head->next) return head;
ListNode* p = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return p;
};