题目:输入一个链表的头结点,从尾到头打印链表的每个节点的值。
链表的节点定义如下:
typedef struct ListNode
{
int data;
ListNode * pNext;
}ListNode;
看到这里从尾到头打印当然很简单,只需要遍历一遍链表就可以完成。但是是从后往前打印,当然这是单向链表。当然也可以改变指向来解决问题但是会破坏链表的结构,一般不会被允许。
一种思想是我们可以用栈来实现这种顺序,遍历一遍逐渐压栈,最后在从栈里弹出来,就可以实现反转链表。但是要调用stack 里的一些函数。
最后可以用到递归来完成:
void print_list_reverse(ListNode*pHead)
{
if (NULL != pHead)
{
if (pHead->pNext != NULL)
{
print_list_reverse(pHead->pNext);//访问下一个节点
}
printf("%d\n", pHead->data);
}
}
递归本来就是一个栈结构,访问本节点的时候首先访问下一个节点,然后递归从最后一个节点输出。