/**
输入一个链表,输出该链表中倒数第k个结点。
涉及到链表的数据结构,通常使用指针(指向链表节点的指针)
使用双指针,pointer1和pointer2,初始情况下,pointer1指向链表的首节点
pointer2将会比pointer1快k步,
则当pointer2走到链表尾端的时候,pointer1指向的就是链表中的倒数第k个节点
**/
#include<iostream>
using namespace std;
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}// 结构体的构造函数
};
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
//cout<<"--------------"<<endl;
//cout<<"line 1 "<<pListHead<<endl;
if(k==0 or pListHead==NULL){
return NULL;
}
ListNode* pointer1=pListHead;
ListNode* pointer2=pListHead;
while(k>1){
pointer2=pointer2->next;
if(pointer2==NULL){
return NULL;
}
k--;
}
//cout<<"here "<<pointer2->val<<endl;
while(pointer2->next!=NULL){
pointer1=pointer1->next;
pointer2=pointer2->next;
}
return pointer1;
}
};
int main(){
int a[5]={1,2,3,4,5};
ListNode *pHead=new ListNode(0);
pHead->val=0;
pHead->next=NULL;
ListNode* p=pHead;
for(int i=0;i<5;i++){
ListNode* new_node=new ListNode(a[i]);
p->next=new_node;
p=p->next;
}
Solution b;
ListNode* out=b.FindKthToTail(pHead->next,5);
cout<<out->val<<endl;
return 0;
}