求链表的倒数第N个节点

最近看一本书上有求链表的倒数第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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值