输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
输入:head = [1,3,2] 输出:[2,3,1]
目录
1、反转链表
在创建dummy节点时,应该使用dummy->next = nullptr,而不是dummy = curr->next。因为dummy节点应该作为新链表的头节点,而不是替代原有的头节点。
在遍历链表反转节点的过程中,需要使用一个指针prev来记录前一个节点,以便正确地反转指针的指向。同时需要更新curr和dummy指针的位置。
反转完链表后,需要将反转后的链表中的节点值存入数组中,然后返回数组。
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
ListNode *dummy = new ListNode(0);
ListNode *curr = head;
ListNode *prev = nullptr;
while(curr){
ListNode *nextNode = curr->next;
curr->next = prev;
prev = curr;
curr = nextNode;
}
vector<int> result;
while(prev){
result.push_back(prev->val);
prev = prev->next;
}
return result;
}
};
2、辅助栈
- 创建一个栈
stk
用于存储链表节点的值。- 遍历链表,将每个节点的值压入栈中。
- 创建一个空的数组
res
用于存储反转后的节点值。- 当栈不为空时,依次将栈顶元素弹出并添加到数组
res
的末尾。- 返回数组
res
,即为从尾到头的节点值。
注意:
push_back()函数的用法
函数将一个新的元素加到vector的最后面,位置为当前最后一个元素的下一个元素。
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
stack<int> stk;
while(head != nullptr) {
stk.push(head->val);
head = head->next;
}
vector<int> res;
while(!stk.empty()) {
res.push_back(stk.top());
stk.pop();
}
return res;
}
};