题目描述
输入一个链表的头结点,按照 从尾到头 的顺序返回节点的值。
返回的结果用数组存储。
样例
输入:[2, 3, 5]
返回:[5, 3, 2]
算法1
(逆置链表法)
依次遍历链表, 每遍历一个节点,逆置一个节点。
1. 备份head->next
2. 更新head->next为new_head
3. 更新new_head为head
4. 更新head
逆置结束后,依次将值放入数组中
时间复杂度 $O(n)$
C++ 代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
vector<int> printListReversingly(ListNode* head) {
vector<int> v;
//指针初始化是一定要赋值,否则出现野指针
//NULL nullptr 0的区别
ListNode* newHead = nullptr;
//逆置单链表
while(head != NULL)
{
//保存head->next
ListNode* next = head->next;
//更新head->next为new->head
head->next = newHead;
//更新newHead为head
newHead = head;
//更新head为next
head = next;
}
while(newHead != NULL)
{
v.push_back(newHead->val);
newHead = newHead->next;
}
return v;
}
};
算法2
(遍历链表,逆序数组)
链表只能从前往后遍历,不能从后往前遍历,但是数组可以
1. 依次遍历链表,将结果保存到数组中
2. 返回逆序的数组
时间复杂度 $O(n)$
参考 yxc
C++ 代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
vector<int> printListReversingly(ListNode* head) {
vector<int> res;
while (head) {
res.push_back(head->val);
head = head->next;
}
return vector<int>(res.rbegin(), res.rend());
}
};