- 题目:输入一个链表的头节点,从头到尾反过来打印每个节点的值。
- 思路:要打印单链表就必须遍历单链表,遍历的顺序是从头到尾,而打印的顺序是从尾到头,就是说最先遍历的节点最后打印,最后遍历的节点最先打印,就是所谓的后进先出,那么我们就可以用栈实现这种顺序,从头到尾遍历链表,每遍历一个节点将它保存到栈中,知道整个链表遍历完成,在从栈中一次取出节点并打印对应的值。
- 实现代码
void ResverPrintList1(pNode pHead)
{
std::stack<pNode> s;
while (NULL != pHead)
{
s.push(pHead);
pHead = pHead->_pNext;
}
while (!s.empty())
{
pNode pCur = s.top();
printf("%d ->", pCur->_data);
s.pop();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
递归
既然采用栈来解决,那么递归在本质上就是一个栈,我们同样可以采用递归来解决这个问题。实现代码
void ResverPrintList(pNode pHead)
{
if (NULL == pHead)
return;
if (pHead->_pNext)
ResverPrintList(pHead->_pNext);
printf("%d ->", pHead->_data);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 测试用例
void FunTest()
{
pNode head;
InitNode(&head);
PushBack(&head, 10);
PushBack(&head, 9);
PushBack(&head, 8);
PushBack(&head, 7);
PushBack(&head, 6);
PushBack(&head, 5);
PushBack(&head, 4);
PushBack(&head, 3);
PushBack(&head, 2);
PushBack(&head, 1);
ResverPrintList(head);
printf("\n");
ResverPrintList1(head);
}
int main()
{
FunTest();
system("pause");
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24