题目描述
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
样例
输入:1->2->3->4->5->NULL
输出:5->4->3->2->1->NULL
迭代法
时间复杂度 O(N)
C++ 代码
/**
* 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 *pre = nullptr;
while(head)
{
ListNode *tmp = head->next;
head->next = pre;
pre = head;
head = tmp;
}
return pre;
}
};
递归法
初始链表如下:
所以对于ListNode*next = reverseList(head->next)
的意思如下图所示:
把后面看成一个整体,你只管执行后会得到什么结果,结果如下所示:
接下来就是最后两行代码,head->next->next=head
,也就是将上图中的2指向1;最后将经过head->next=NULL
就完成了全部操作。
时间复杂度 O(N)
C++ 代码
/**
* 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*next = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return next;
}
};