码迷,mamicode.com
首页 > 其他好文 > 详细

求链表的倒数第N个节点

时间:2015-11-07 10:55:16      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:

最近看一本书上有求链表的倒数第N个节点,简单实现了下 链表,实现方案如下

1、不借助链表长度顺序遍历倒数第N个节点 GetReserveN就是如此实现。

2、当然如果链表记录了节点长度也可以直接正序遍历出来 第lenth-N个节点就是倒数节点。

template<class T> class LinkedList
{
public:
    operator T(){return m_data;}
    virtual ~LinkedList()
    {
        if(m_size!=0)
            Clear();
    }
    void  AddData(T data)
    {
        if(m_size==0)
        {
            m_data=data;
        }
        else
        {
            LinkedList<T>* pTem=new LinkedList<T> ;
            pTem->m_data=data ;
            pTem->m_pPrev=this->m_pTail ;
            pTem->m_pNext=0;
            this->m_pTail->m_pNext=pTem;
            this->m_pTail=pTem;
        }
        m_size++;
    }
    void  SetData(T data)
    {
        m_data=data;
    }
    void  Clear()
    {
        LinkedList<T>*pTem=this->Next();
        LinkedList<T>*pDel;
        for(; pTem;)
        {
            pDel=pTem;
            pTem=pTem->Next();
            delete pDel;
        }
        m_pTail=this;
        m_pPrev=this;
        m_size=0;
    }
    int Size()
    {
        return m_size;
    }
    T  GetData()
    {
        return m_data ;
    }
    LinkedList<T>*Next()
    {
        return m_pNext;
    }
    LinkedList<T>*GetTail()
    {
        return m_pTail;
    }
    LinkedList<T>*GetPrevious()
    {
        return m_pPrev;
    }
    LinkedList<T>* GetReserveN(int n)
    {
        if(n>m_size||n<=0)
            return 0;
        LinkedList<T>*pFront=this;
        LinkedList<T>*pBehand=this;
        for(int i=1; i<=n; i++)
        {
            pBehand=pBehand->Next();
        }
        while(true)
        {
            if(pBehand==0)
                return pFront ;
            pBehand=pBehand->Next();
            pFront=pFront->Next();
        }
    }
    static LinkedList<T>* CreateList()
    {
        return new LinkedList<T>;
    };
private:
    LinkedList():m_pNext(0),m_pPrev(0),m_pTail(0),m_size(0)
    {
        m_pTail=this;
        m_pPrev=this;
    }
    LinkedList<T>*m_pNext;
    LinkedList<T>*m_pTail;
    LinkedList<T>*m_pPrev;
    int m_size;
    T m_data;
};
测试代码如下 

#include <iostream>
#include<string>
#include "LinkedList.h"
using namespace std;
int main()
{
    LinkedList<string> *pTem=LinkedList<string>::CreateList();
    pTem->AddData("xxx");
    pTem->AddData("dsdf");
    pTem->AddData("dfsd");
    pTem->AddData("dseee");
    pTem->AddData("xxxx");
    pTem->AddData("dsfdsf");
    pTem->AddData("fdsfd");
    LinkedList<string>*p=pTem ;
    for(; p;)
    {
        cout<<p->GetData()<<"," ;
        p=p->Next();
    }
    cout<<endl;
    LinkedList<string>*pData=pTem->GetReserveN(5);
    if(pData)
      cout<<"Reserve N:"<<pData->GetData()<<endl;
    else{
      cout<<"Reserver Not Found !"<<endl;
    }
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

求链表的倒数第N个节点

标签:

原文地址:http://blog.csdn.net/yue7603835/article/details/49699865

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!