【剑指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 的整数倍,那么将最后剩余节点保持原有顺序。