给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
思路
第一种方法将链表转换为数组,然后反转数组,再构建新的链表,这时空间复杂度就是O(n);第二种方法可以利用双指针,定义一个头节点指针cur用以遍历链表,在定义一个prev指针指向前一个结点,初始化为nullptr,因为链表的尾节点的next指针指向nullptr的,用cur遍历链表,遍历时将cur指向的节点的next指针指向其前一个结点prev,反转后的头节点应为prev,返回prev节点,即可实现链表反转。
方式1代码如下:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head == nullptr) return nullptr;
vector<int> tmp;
while(head != nullptr)
{
tmp.push_back(head->val);
head = head->next;
}
reverse(tmp.begin(), tmp.end());
ListNode* newHead = new ListNode(tmp[0]);
ListNode* cur = newHead;
for(int i = 1; i < tmp.size(); ++i)
{
ListNode* newNode = new ListNode(tmp[i]);
cur->next = newNode;
cur = newNode;
}
return newHead;
}
};
方式2代码如下:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* prev = nullptr;
ListNode* cur = head;
while(cur != nullptr)
{
ListNode* tmp = cur->next;
cur->next = prev;
prev = cur;
cur = tmp;
}
return prev;
}
};