原题链接:反转链表
个人解法
思路:
画图看指针如何操作即可。
时间复杂度: O ( n ) O(n) O(n)
代码:
迭代解法
/**
* 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) return nullptr;
ListNode *p = head, *q = head->next;
while(q) {
ListNode *t = q->next;
q->next = p;
p = q, q = t;
}
head->next = nullptr;
return p;
}
};
递归解法
/**
* 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 *new_head;
void rev(ListNode*p, ListNode*q) {
if(q == nullptr) {
new_head = p;
return;
}
rev(q, q->next);
q->next = p;
return;
}
ListNode* reverseList(ListNode* head) {
if(head == nullptr) return nullptr;
ListNode *p = head, *q = head->next;
rev(p, q);
p->next = nullptr;
return new_head;
}
};