描述
给定一个单链表的头结点pHead,长度为n,反转该链表后,返回新链表的表头。
数据范围: n\leq1000n≤1000
要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:
示例1
输入:{1,2,3}
返回值:{3,2,1}
示例2
输入:{}
返回值:{}
说明:空链表则输出空
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(pHead == nullptr) return nullptr;
vector<ListNode*> v; ///定义一个数组存储链表中的所有节点
while(pHead){ ///将链表中的节点放入数组中
v.push_back(pHead);
pHead = pHead->next;
}
reverse(v.begin(), v.end()); ///将数组翻转
ListNode* head = v[0]; ///定义head指向头节点
ListNode* p = head; ///p指针用来遍历
for(int i = 1; i < v.size(); i ++ ){ ///遍历整个数组并重建单链表
p->next = v[i]; ///p是尾指针,永远指向链表最后一个节点
p = p->next;
}
p->next = nullptr; ///将最后一个节点的指针域置空
return head;
}
};
三指针解法
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
ListNode *pre = nullptr; ///pre指向当前节点的前一个节点,因为最开始的当前节点为首元节点,故初始化为空
ListNode *cur = pHead; ///cur指向当前节点
ListNode *nex = nullptr; ///nex指向当前节点的下一个节点,初始化为空
while(cur){
nex = cur->next;
cur->next = pre; ///翻转指针
pre = cur;
cur = nex;
}
///循环退出后cur指针为空,返回pre即可
return pre;
}
};