输入一个单链表的头结点,从尾到头打印整个链表每个节点的值
两种思路:
1.不破坏单链表的结构,用栈或者递归的方式实现反转打印;
2.反转整个链表,再打印每个节点的值。
(1)利用栈的数据结构来实现
void PrintList_reverse(ListNode* head)
{
std::stack<ListNode*> nodes;
ListNode* p=head;
while(p!=NULL)
{
nodes.push(p);
p=p->next;
}
while(!nodes.empty())
{
p=nodes.top();
printf("%d\t",p->value);
nodes.pop();
}
(2)利用递归的方式实现
vioid PrintList_reverse(ListNode* head)
{
if(head!=NULL)
{
if(head->next!=NULL)
{
PrintList_reverse(head->next);
}
printf("%d\t",head->value);
}
}
递归的本质是一个栈的结构,我们在访问每个节点的时候,先输出它后面的节点,在输出该节点,这样就可以把链表反转输出;
递归的代码很简洁,但是当链表长度很长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出。