数据结构与算法面试题80道(13)

13:

题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。

链表结点定义如下

struct ListNode

{

 int m_nKey;

 ListNode* m_pNext;

};

 思路:我用的最笨的办法,先统计长度,在遍历去找,O(2n)

#include<cstdio>
#include<iostream>
using namespace std;

struct ListNode{
    int m_nKey;
    ListNode* m_pNext;
};

void addNode(ListNode *&mList,int value){
    if(mList==NULL){
         ListNode *_list=new ListNode();
         if(_list==NULL) {cout<<"内存错误"<<endl;return;}
        _list->m_nKey=value;
        _list->m_pNext=NULL;
        mList=_list;
    }else addNode(mList->m_pNext,value);
}

ListNode* fun_k(ListNode *mList,int k){
    int len=0;
    ListNode *p=mList;
    while(p!=NULL){
        len++;
        p=p->m_pNext;
    }
    if(k>len) return NULL;
    p=mList;
    for(int i=0;i<len-k;i++)
        p=p->m_pNext;
    return p;
}

int main(){

    ListNode *head=NULL;
    addNode(head,1);
    addNode(head,2);
    addNode(head,3);
    addNode(head,4);
    addNode(head,5);
    addNode(head,6);
    addNode(head,7);
    ListNode *p=new ListNode();

    int k=3;
    p=fun_k(head,k);
    cout<<"list 的倒数第K个结点是:"<<p->m_nKey<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/wabi87547568/p/5263585.html