给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围: 0\leq n\leq10000≤n≤1000
要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:
方法一:使用stack容器储存每一个节点,最后再反转逐个提取即可。
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(!pHead){
return nullptr;
}
stack<ListNode*> stack1;
while(pHead){
stack1.push(pHead);
pHead = pHead->next;
}
ListNode* head = stack1.top();
while(!stack1.empty()){
ListNode* cur = stack1.top();
stack1.pop();
if(stack1.empty()){
cur->next = nullptr;
return head;
}
cur->next = stack1.top();
}
return head;
}
};
方法二:直接在原链表上动土,用三个 指针last指向反转后的最后一个节点,即原链表第一个节点。mid指向反转前第二个节点,用来保存当前节点。last反转后第一个节点,即反转前最后一个节点
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(!pHead){
return nullptr;
}
ListNode* last = pHead;
ListNode* mid = pHead->next;
ListNode* head = pHead;
while(mid){
ListNode* cur = head;
head = mid;
mid = mid->next;
head->next = cur;
}
last->next = nullptr;
return head;
}
};