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

来源:互联网 发布:mac ndk环境变量配置 编辑:程序博客网 时间:2024/06/06 01:34
题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。
链表结点定义如下:   
struct ListNode
{
  int m_nKey;
  ListNode* m_pNext;

};

解题思路:

                使用两个指针,p1,p2,先把p1的指针指向第k个元素,然后p1和p2同时向后遍历,当p1遍历到结尾时,p2正好遍历到倒数第k个。

代码如下:

#include <stdlib.h>#include <iostream>#include <string.h>using namespace std;struct ListNode{  int m_nKey;  ListNode* m_pNext;};ListNode *Head=new ListNode();ListNode *end;int flag=0,k;void newset(ListNode *&Head,int n){ListNode *t;t=new ListNode();t->m_pNext=Head;t->m_nKey=n;Head=t;}void find(ListNode *p1,ListNode *p2){flag++;if(flag==k&&p1!=end){flag--;find(p1->m_pNext,p2->m_pNext);}else if(flag==k&&p1==end){cout<<"输出倒数第k个结点:"<<p2->m_nKey<<endl;return;}else if(flag<k){find(p1->m_pNext,p2);}}int main(){end=new ListNode();Head->m_pNext=end;Head->m_nKey=8;newset(Head,4);newset(Head,5);newset(Head,3);newset(Head,7);newset(Head,3);newset(Head,6);newset(Head,2);cout<<"Head->m_nKey="<<Head->m_nKey<<endl;ListNode *p1=Head;ListNode *p2=Head;flag=-1;k=rand()%8+1;cout<<"k="<<k<<endl;find(p1,p2);return 0;}