经典面试题之逆序打印单链表

  • 题目:输入一个链表的头节点,从头到尾反过来打印每个节点的值。
  • 思路:要打印单链表就必须遍历单链表,遍历的顺序是从头到尾,而打印的顺序是从尾到头,就是说最先遍历的节点最后打印,最后遍历的节点最先打印,就是所谓的后进先出,那么我们就可以用栈实现这种顺序,从头到尾遍历链表,每遍历一个节点将它保存到栈中,知道整个链表遍历完成,在从栈中一次取出节点并打印对应的值。
  • 实现代码
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

猜你喜欢

转载自blog.csdn.net/qingzhuyuxian/article/details/80968910