双链表实现Queue

算法导论第10章的东西,感觉用双链表真心简单,就是有点浪费空间,但是时间复杂度O(1):

#include <stdio.h>

struct LinkNode
{
    LinkNode(): m_Value(-1)
        , m_pPreNode(NULL)
        , m_pNextNode(NULL)
    {

    }
    int m_Value;
    LinkNode* m_pPreNode;
    LinkNode* m_pNextNode;
};
class Queue
{
public:
    void Init()
    {
        m_pHeadNode = new LinkNode();
        m_pHeadNode->m_pNextNode = m_pHeadNode;
        m_pHeadNode->m_pPreNode = m_pHeadNode;
    }
    void DeEqueue()
    {
        if (m_pHeadNode->m_pPreNode == m_pHeadNode)
        {
            return ;
        }

        LinkNode* lpNode = m_pHeadNode->m_pNextNode;
        m_pHeadNode->m_pNextNode = lpNode->m_pNextNode;
        lpNode->m_pNextNode->m_pPreNode = m_pHeadNode;

        delete lpNode;
        lpNode = NULL;
    }
    int Tail()
    {
        LinkNode* lpTail = m_pHeadNode->m_pPreNode;
        if (lpTail != m_pHeadNode)
        {
            int lTop = lpTail->m_Value;
            printf("tail:%d\n",lTop);
            return lTop;
        }
        return -1;
    }
    
    int Head()
    {
        LinkNode* lpHead = m_pHeadNode->m_pNextNode;
        if (lpHead != m_pHeadNode)
        {
            printf("Head:%d\n",lpHead->m_Value);
            return lpHead->m_Value;
        }
        return -1;
    }
    void EnQueue(int aValue)
    {
        LinkNode* lpNewNode = new LinkNode();
        lpNewNode->m_Value = aValue;

        LinkNode* lpNode = m_pHeadNode->m_pPreNode;
        if (NULL == lpNode)
        {
            m_pHeadNode->m_pPreNode = lpNewNode;
            lpNewNode->m_pNextNode = m_pHeadNode;
            lpNewNode->m_pPreNode = m_pHeadNode;
            m_pHeadNode->m_pNextNode = lpNewNode;
        }
        else
        {
            m_pHeadNode->m_pPreNode = lpNewNode;
            lpNewNode->m_pNextNode = m_pHeadNode;
            lpNewNode->m_pPreNode = lpNode;
            lpNode->m_pNextNode = lpNewNode;
        }
    }
    void Print()
    {
        LinkNode* lpNode = m_pHeadNode->m_pNextNode;
        while(lpNode)
        {
            if (lpNode == m_pHeadNode)
            {
                break;
            }

            printf("%d ",lpNode->m_Value);
            lpNode = lpNode->m_pNextNode;
        }
    }
private:
    LinkNode* m_pHeadNode;
};
int main()
{
    Queue lQueue;
    lQueue.Init();
    lQueue.EnQueue(1);
    lQueue.Head();
    lQueue.Tail();
    lQueue.EnQueue(2);
    lQueue.Head();
    lQueue.Tail();
    lQueue.EnQueue(4);
    lQueue.Head();
    lQueue.Tail();
    lQueue.DeEqueue();
    lQueue.Head();
    lQueue.Tail();
    lQueue.Print();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值