【剑指Offer】【链表】4_从尾到头反转链表
题目:从尾到头反转链表。输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
A1:将链表反转,再从头到尾输出到vector中。 ====> 改变链表的结构
A2:从头到尾输出链表到vector中,在将vector反抓(反向迭代器)
A3:反向输出是一个先进后出的概念,所以可以用栈来实现这个顺序。
把链表的节点逐个压栈,入栈结束后,链头就在栈底,链尾就在栈头,然后顺序出栈即可。 ====> 不会改变链表的结构
A4:递归在本质上也是一个栈结构。
每访问到一个节点时,先滴回输出后面的节点,再输出节点本身。
//vector反向迭代器
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> ret;
while(head != nullptr)
{
ret.push_back(head->val);
head = head->next;
}
return vector<int>(ret.rbegin(), ret.rend());
}
};

//栈
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
stack<int> tmp;
vector<int> ret;
while(head != nullptr)
{
tmp.push(head->val);
head = head->next;
}
while(!tmp.empty())
{
ret.push_back(tmp.top());
tmp.pop();
}
return ret;
}
};

//递归
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> ret;
if(head == nullptr)
{
return ret;
}
ret = printListFromTailToHead(head->next);
ret.push_back(head->val);
return ret;
}
};

相关题目:
找出单向链表中的一个节点,该节点到尾指针的距离为K。链表的倒数第0个结点为链表的尾指针。要求时间复杂度为O(n)
实现单链表的逆转函数,输入一个链表,反转链表后,返回翻转之后的链表。
给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。

浙公网安备 33010602011771号