5.10 BM1 反转链表
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围: 0≤n≤1000
要求:空间复杂度O(1) ,时间复杂度O(n) 。
class Solution { //1.递归
public:
ListNode* ReverseList(ListNode* pHead) {
//特判:注意不要漏掉pHead->next==NULL的情况
if(pHead==NULL || pHead->next==NULL) return pHead;
//递归调用
ListNode* ans = ReverseList(pHead->next);
//让当前结点的下一个结点的 next 指针指向当前节点
pHead->next->next=pHead;
//同时让当前结点的 next 指针指向NULL ,从而实现从链表尾部开始的局部反转
pHead->next=NULL;
return ans;
}
};
class Solution { //2.暴力解法
public:
ListNode* ReverseList(ListNode* pHead) {
if(pHead==NULL||pHead->next==NULL) return pHead;
ListNode* pre=NULL;
while(pHead) //判断列表是否已经到结尾
{
ListNode* t=pHead->next; //保留下一个即将翻转的表头
pHead->next=pre; //将现在要翻转的结点的后继指向前一个结点 pre
pre=pHead; //现在的pHead要成为下一个结点
pHead=t; //pHead要成为下一个要翻转的节点
}
return pre;
}
};
class Solution { //3.数组元素翻转
public:
ListNode* ReverseList(ListNode* pHead) {
if (!pHead) return pHead;
vector<ListNode*> res;
for (; pHead; pHead= pHead->next) {
res.emplace_back(pHead); // 把每一个元素放入数组
}
reverse(res.begin(), res.end()); // 使数组取反
for (int i = 0; i < res.size() - 1; i++) {
res[i]->next = res[i + 1]; // 根据取反后的数组顺序重新构建链表
}
res[res.size() - 1]->next = nullptr; // 注意将最后一个元素的后继节点置为空,否则会出现环
return res[0];
}
};