【剑指 Offer】006. 从尾到头打印链表
题目描述
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]限制:
0 <= 链表长度 <= 10000
栈
直接能想到的方法,将链表遍历一遍,遍历的同时将节点值压栈,最后依次出栈。
// C++
// 使用栈实现
vector<int> reversePrint(ListNode *head)
{
stack<ListNode *> nodes;
vector<int> res;
ListNode *pNode = head;
while (pNode != nullptr)
{
nodes.push(pNode);
pNode = pNode->next;
}
while (!nodes.empty())
{
pNode = nodes.top();
res.emplace_back(pNode->val);
nodes.pop();
}
return res;
}
// python
# 利用栈
def reversePrint2(head: ListNode) -> List[int]:
stack = []
node = head
while node:
stack.append(node)
node = node.next
return stack[::-1]
// C++
// 使用递归实现
void reversePrint2(ListNode *head)
{
if (head->next != nullptr)
{
reversePrint(head->next);
}
cout << head->val << endl;
}
//python
# 递归
def reversePrint(head: ListNode) -> List[int]:
return reversePrint(head.next) + [head.val] if head else []
原地修改链表结构
遍历链表的同时,将链表反转
// C++
// 修改链表结构
void reversePrint3(ListNode *head)
{
if (head == nullptr)
return;
// ListNode *nextNode;
ListNode *node = head;
ListNode *preNode = nullptr;
ListNode *nextNode = head;
while (nextNode != nullptr)
{
nextNode = node->next; // 记录下一个节点
node->next = preNode; // 将当前节点的下一个节点改为上一个节点
preNode = node; // 链修改完成,将上一个节点移至当前节点,为下一个链修改作准备
if(nextNode!=nullptr) // 如果下一个节点不为空,当前节点下移
node = nextNode;
}
while(node!=nullptr)
{
cout << node->val << endl;
node = node -> next;
}
}
// python
def reversePrint3(head: ListNode) -> List[int]:
node = head
preNode = None
nextNode = head
while nextNode:
nextNode = node.next
node.next = preNode
preNode = node
if nextNode:
node = nextNode
ret = []
while node:
ret += node.val
node = node.next
return ret