文章目录
- 反转链表
- 题目来源
- 题目描述
- 知识点
- 题解
- 题解一(递归实现)
- 图解
- 题解二(双指针)
- 图解
反转链表
题目来源
牛客网
题目描述
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围: 0≤n≤10000≤n≤1000
要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。
如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
知识点
链表
题解
题解一(递归实现)
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(pHead == nullptr || pHead->next == nullptr)
return pHead;
ListNode* ans = ReverseList(pHead->next);
pHead->next->next = pHead;
pHead->next = nullptr;
return ans;
}
};
图解
递归的问题是如果数据过大,可能会栈溢出,空间开销比较大。
题解二(双指针)
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(pHead == nullptr || pHead->next == nullptr)
return pHead;
ListNode* cur = pHead;
ListNode* pre = pHead->next;
pHead->next = nullptr;
while(pre != nullptr)
{
ListNode* next = pre->next;
pre->next = cur;
cur = pre;
pre = next;
}
return cur;
}
};