求链表的倒数第N个节点

简介: 最近看一本书上有求链表的倒数第N个节点,简单实现了下 链表,实现方案如下1、不借助链表长度顺序遍历倒数第N个节点 GetReserveN就是如此实现。2、当然如果链表记录了节点长度也可以直接正序遍历出来 第lenth-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;
}



目录
相关文章
|
3月前
|
机器学习/深度学习 算法
24. 两两交换链表中的节点, 19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交
1. **两两交换链表中的节点**:通过引入虚拟头结点,使所有节点都能采用统一的交换逻辑,避免对头结点单独处理。 2. **删除链表的倒数第N个节点**:利用双指针技巧,让快慢指针保持N个节点的距离,当快指针到达末尾时,慢指针正好指向待删除节点的前一个节点。 3. **链表相交**:先计算两链表长度并调整起点,确保从相同距离末尾的位置开始遍历,从而高效找到相交节点或确定无交点。 以上方法均在时间复杂度和空间复杂度上进行了优化,适合用于理解和掌握链表的基本操作及常见算法设计思路。
|
11月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
168 1
|
11月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
115 0
LeetCode第二十四题(两两交换链表中的节点)
|
11月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
109 0
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
|
12月前
05_删除链表的倒数第N个节点
05_删除链表的倒数第N个节点
|
11月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
122 0
|
11月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
124 0
|
12月前
04_两两交换链表中的节点
04_两两交换链表中的节点
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表