输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
限制:
0 <= 链表长度 <= 10000
链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof
方法1 利用栈:
思路: 倒序输出一般可以考虑使用栈的“先进后出”的特性
时间复杂度:O(n):因为O(n) + O(n) = 2O(n),时间复杂度中可以忽略常数,故为O(n)
空间复杂度:O(n):另外使用了一个vector容器
// 1.利用栈:倒序输出一般可以考虑使用栈的“先进后出”的特性:
vector<int> reversePrint(ListNode* head) {
stack<int> st;
vector<int> v;
while (head != NULL)
{
st.push(head->val);
head = head->next;
}
while (!st.empty())
{
v.push_back(st.top());
st.pop();
}
return v;
}
方法2 reverse():
思路: 利用C++ STL中的reverse()
时间复杂度:O(n)
空间复杂度:O(n):另外使用了一个vector容器
// 2.利用C++ STL中的reverse():
vector<int> reversePrint(ListNode* head) {
vector<int> v;
while (head != NULL)
{
v.push_back(head->val);
head = head->next;
}
reverse(v.begin(), v.end());
return v;
}
方法3 反转链表:
思路: 可参考 206. 反转链表
时间复杂度:O(n):因为O(n) + O(n) = 2O(n),时间复杂度中可以忽略常数,故为O(n)
空间复杂度:O(n):另外使用了一个vector容器
// 3.反转链表:
vector<int> reversePrint(ListNode* head) {
ListNode* pPre = NULL;
ListNode* pMid = head; // 该题head中存放有效值,而不是单纯的链表头,所以不是pMid = head->next,而要指向head
ListNode* pEnd = NULL;
while (pMid != NULL)
{
pEnd = pMid->next;
pMid->next = pPre; // 反向连接
pPre = pMid;
pMid = pEnd;
}
head = pPre; // 1.同理由于head中存放有效值,而不是单纯的链表头,所以不是 head->next = pPre/* */
// 2.因为退出while循环时,pMid指向NULL,而pPre正好指向原链表尾元素,且是有效值
vector<int> v;
while (head != NULL) // 遍历
{
v.push_back(head->val);
head = head->next;
}
return v;
}