求链表的倒数第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;
}

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

时间: 2025-01-14 07:47:55

求链表的倒数第N个节点的相关文章

求链表的倒数第k个节点

问题描述:给定一个链表的头节点,求出链表的倒数第k个节点. 分析:这是链表里的经典问题,存在多种解法,下面给大家分享下我的想法. 解法一:很直观的一种做法是从头到尾扫描链表,然后求倒数第k个,但是由于单链表无法从尾部向头部扫描, 因此可以借助其他的辅助空间去存储扫描过的所有节点,例如,数组或栈均可. 解法二:计算出链表中节点的总数为n,根据k 将其转化为正数的第n-k+1个节点,然后在从链表头开始走n-k+1个节点,就是所求. 解法三:可以设置两个指针实现,假设两个指针分别为p1和p2,p1从链

12,求链表的倒数第k个节点《剑指offer》

题目: 输入一个链表,输出该链表中倒数第k个结点. 思路: 两个指针一个先走k步,然后两个一起走,先走的到达终点时后一个指向的就是所求的节点,注意可能长度小于k,这时候应该返回null 代码: /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* FindKthToTail(ListN

求链表中倒数第k个节点

注意鲁棒性和算法效率的典型例题:(头文件省略) typedef struct node { int data; struct node* next; }ListNode; ListNode* FindKthToTail(ListNode* pListHead, unsigned int k); int main() { int i; const int N = 50; ListNode *head, *p; //随机数种子 srand((unsigned int)time(0)); //生成链表

剑指offer-第三章高质量的代码(输出该链表中倒数第K个节点)

题目:输入一个链表,输出这个链表中倒数第K个节点.(代码的鲁棒性) 思路:用两个指针p1和p2,都指向头节点,开始的时候,p2不动,p1移动k-1次,指向第k个节点.此时,如果p1->next!=null,则同时移动P1和p2.直到p1指向最后一个节点.此时,P2指向倒数第k个节点. C++代码: #include<iostream> using namespace std; struct ListNode { int m_nValue; ListNode* m_pNext; }; Li

25.Remove Nth Node From End of List(删除链表的倒数第n个节点)

Level: ??Medium 题目描述: Given a linked list, remove the n-th node from the end of list and return its head. Example: Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from the end, the linked list becomes 1->2->3-

删除链表中倒数第n个节点

1.给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 给出链表1->2->3->4->5->null和 n = 2. 删除倒数第二个节点之后,这个链表将变成1->2->3->5->null. 注意 链表中的节点个数大于等于n 挑战 O(n)时间复杂度 解题思路:刚开始看到倒数第n个节点,不禁感慨如果是数组就可以直接倒着来了.不过针对链表,一定要想起来最常用的方法---快慢指针.设一个fast和slow指针:快指针先走n步,然后快慢指针一起走,

lintcode 容易题:Remove Nth Node From End of Lis 删除链表中倒数第n个节点

题目: 删除链表中倒数第n个节点 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点.  样例 给出链表1->2->3->4->5->null和 n = 2. 删除倒数第二个节点之后,这个链表将变成1->2->3->5->null. 注意 链表中的节点个数大于等于n 解题: 要删除倒数第n个节点,我们要找到其前面一个节点,也就是倒数第n+1的节点,找到这个节点就可以进行删除.和上题的思想很类似, 定义两个指针,p和cur,cur指针向前走,走了n

【LeetCode-面试算法经典-Java实现】【019-Remove Nth Node From End of List(移除单链表的倒数第N个节点)】

[019-Remove Nth Node From End of List(移除单链表的倒数第N个节点)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a linked list, remove the nth node from the end of list and return its head. For example, Given linked list: 1->2->3->4->5, and n = 2. After remo

C++ 算法之 链表中倒数第k个节点

题目:输入一个链表,输出链表中倒数第k个节点,为了符合大多数人的习惯,本题从1开始计数,即链表的尾巴节点是倒数第一个节点. 方法1:先遍历链表得到链表的个数n,倒数第k个节点就是n-k+1再遍历一次链表,找到第n-k+1个节点就是倒数第k个节点:这种方法遍历两次链表: 方法2:先遍历链表把链表压入一个栈,再出栈,第k次出栈就是第k个节点: 方法3:先反转链表,再遍历 方法4:定义两个指针,第一个指针从链表的头指针开始遍历向前走k-1:第二个指针保持不动,从第k步开始,第二个指针也开始遍历,两个指