从尾到头输出链表 【微软面试100题 第五十八题】

题目要求:

  输入一个链表的头结点,从尾到头反过来输出每个结点的值。

  参考资料:剑指offer第5题。

题目分析:

  可以用栈或者递归。

  栈把链表结点从头到尾依次存储,这样最终栈顶就是链表尾部。

  递归,对于当前结点,可以用递归输出当前结点之后的结点,再输出当前结点。

代码实现:

  

#include <iostream>

#include <stack>



using namespace std;



typedef struct ListNode

{

    struct ListNode *next;

    int data;

}ListNode;



void InitList(ListNode **head1);

void PrintListReverse(ListNode *head);

void PrintListReverseByStack(ListNode *head);



int main(void)

{

    ListNode *h;

    

    InitList(&h);

    PrintListReverse(h);

    cout << endl;

    PrintListReverseByStack(h);

    cout << endl;



    return 0;

}

//递归

void PrintListReverse(ListNode *head)

{

    if(head!=NULL)

    {

        if(head->next != NULL)

            PrintListReverse(head->next);

        cout << head->data << " ";

    }

}

//

void PrintListReverseByStack(ListNode *head)

{

    stack<ListNode *> store;

    while(head!=NULL)

    {

        store.push(head);

        head = head->next;

    }

    while(!store.empty())

    {

        cout << store.top()->data << " ";

        store.pop();

    }

}



//head:1-->5-->9-->NULL

void InitList(ListNode **head1)

{

    ListNode *tmp = new ListNode;

    tmp->data = 1;

    *head1 = tmp;



    tmp = new ListNode;

    tmp->data = 5;

    (*head1)->next = tmp;



    ListNode *tmp1 = new ListNode;

    tmp1->data = 9;

    tmp1->next = NULL;

    tmp->next = tmp1;

}

 

你可能感兴趣的:(面试)