zoukankan      html  css  js  c++  java
  • 从尾到头打印链表--《剑指offer》

    题目:非常easy,就是题目,将链表从尾到头打印出来

    可能我们首先想到的是将链表进行遍历,将之前的訪问的数据进行保存,最后进行反向输出,但是保存数据的空间是个问题;或者是我们将整个链表进行反向操作,将整个链表进行逆置,但是我们仅仅是进行打印操作而已,改变链表不合适吧...

    事实上这时候应该想到了,用栈:既然是逆置,和栈的功能不就不谋而合吗,后进先出,进行反向打印。

    //2014-5-18
    //反向输出链表
    #include <iostream>
    #include <cstdlib>
    #include <stack>
    
    using namespace std;
    
    typedef struct Node
    {
        int data;
        struct Node *next;  /* 指向下个节点 */
    } Node, *LinkNode;
    
    void Create(LinkNode &head)
    {
        head = (LinkNode) malloc(sizeof(Node));
        head->next = NULL;
    }
    
    void Insert(LinkNode &head, int i)
    {
        if(head -> next == NULL)
        {
            LinkNode p = (LinkNode) malloc(sizeof(Node));
            p->data = i;
            p->next = head->next;
            head->next = p;
            return;
        }
        LinkNode p = head;
        while(p->next != NULL)
        {
            p = p->next;
        }
        LinkNode q = (LinkNode) malloc(sizeof(Node));
        q->data = i;
        q->next = p->next;
        p->next = q;
        //free(q);
        return;
    }
    
    void OppoLink(const LinkNode &L)
    {
        if(L == NULL)
            return;
        LinkNode p = L->next;
        stack<int> node;
        while(p != NULL)
        {
            node.push(p->data);
            p = p->next;
        }
    
        while(!node.empty())
        {
            cout << node.top() << "  ";
            node.pop();
        }
        cout << endl;
    }
    
    int main()
    {
        LinkNode L;
    
        Create(L);
        for(int i = 0; i < 10; i++)
        {
            Insert(L, i);
        }
    
        OppoLink(L);
        return 0;
    }
    输出例如以下:

    书中也是如我这般的,只是对于栈的处理不同,我是使用stack<int> node;进行数据存储,而书中则是使用节点存储,只是我想这应该差点儿相同吧...(详细我也不知道,假设有什么看法的希望指出)

    书中给出例如以下一段话:


    这个我倒是真没想到,只是依照提示递归实现了:

    void OppoLink(LinkNode L)
    {
        if(L!=NULL)
        {
            if(L->next != NULL)
            {
                OppoLink(L->next);
            }
            cout << L->data << " ";
        }
    }
    在调用的时候用OppoLink(L->next),由于我创建的链表有个头结点,当然,它里面的数据非常意外。。。

    只是对于递归大家肯定知道,层数深了的话,后果非常可怕,所以我想用栈应该会更好一些。


    O(∩_∩)O欢迎不吝赐教啦....

  • 相关阅读:
    vue中富文本编辑框
    vue中生成二维码
    在ABP中使用linq
    js根据年月得到当前这个月总共有多少天
    mescroll在vue中的应用
    javascript积累
    javascript常用的操作
    情侣间常犯的7个沟通问题
    欧洲旅游六大最佳目的地
    见与不见
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4354325.html
Copyright © 2011-2022 走看看