#include<iostream.h>
#include <stdio.h>
#include <stack>
//找到链表中第k个结点
//知识点
//1. 当我们用一个指针遍历链表不能解决问题的时候,可以尝试用两个指针遍历链表。
// 可以让其中一个指针遍历的速度快一些,比如说走两步,或若干步。
//2. 类似求链表的中间结点
//3. 判断一个单项链表是否构成了环形结构
struct ListNode
{
int m_nValue;
ListNode * m_pNext;
};
ListNode * CreateLink(int a[],int k)
{
ListNode * Head=NULL,*q=NULL;
for(int i=0;i<k;i++)
{
ListNode * pNew=new ListNode();
pNew->m_nValue=a[i];
pNew->m_pNext=NULL;
if(Head==NULL)
{
Head=pNew;
q=pNew;
}
else
{
q->m_pNext=pNew;
q=q->m_pNext;
}
}
return Head;
}
//从头到尾打印列表
void printLink(ListNode * pHead)
{
cout<<"链表内容为:";
ListNode *p=pHead;
while(p)
{
cout<<p->m_nValue<<" ";
p=p->m_pNext;
}
cout<<endl;
}
//unsigned int范围0~65535
ListNode* FindKthToTail1(ListNode *pListHead,unsigned int k)
{
if(pListHead==NULL || k==0)
return NULL;
int i=1;
ListNode *p=pListHead;
while(i<k && p!=NULL)
{
p=p->m_pNext;
i++;
}
if(i<=k && p==NULL)
return NULL;
else
{
ListNode * q=pListHead;
while(p->m_pNext!=NULL)
{
p=p->m_pNext;
q=q->m_pNext;
}
return q;
}
}
//书上的
ListNode * FindKthToTail(ListNode * pListHead,unsigned int k)
{
if(pListHead ==NULL || k==0)
return NULL;
ListNode *pAhead=pListHead;
ListNode *pBehind=NULL;
for(unsigned int i=0;i<k-1;++i)
{
if(pAhead->m_pNext!=NULL)
pAhead=pAhead->m_pNext;
else
{
return NULL;
}
}
pBehind=pListHead;
while(pAhead->m_pNext!=NULL)
{
pAhead=pAhead->m_pNext;
pBehind=pBehind->m_pNext;
}
return pBehind;
}
//=======测试用例=========
//1.pListHead为空
void Test1()
{
cout<<"测试用例test1"<<endl;
ListNode * ptr=NULL;
printLink(ptr);
ListNode * p=FindKthToTail(NULL,0);
if(p)
cout<<p->m_nValue<<endl;
}
//2.长度为n,k>n时
void Test2()
{
cout<<"测试用例test2"<<endl;
int a[]={1,2,3,4,5};
ListNode * ptr=CreateLink(a,5);
printLink(ptr);
ListNode * p=FindKthToTail(ptr,6);
if(p)
cout<<p->m_nValue<<endl;
}
//3.k==0
void Test3()
{
cout<<"测试用例test3"<<endl;
int a[]={1,2,3,4,5};
ListNode * ptr=CreateLink(a,5);
printLink(ptr);
ListNode * p=FindKthToTail(ptr,0);
if(p)
cout<<p->m_nValue<<endl;
}
//4.k==1
void Test4()
{
cout<<"测试用例test4"<<endl;
int a[]={1,2,3,4,5};
ListNode * ptr=CreateLink(a,5);
printLink(ptr);
ListNode * p=FindKthToTail(ptr,1);
if(p)
cout<<p->m_nValue<<endl;
}
//k==1,n==1
void Test5()
{
cout<<"测试用例test5"<<endl;
int a[]={1};
ListNode * ptr=CreateLink(a,1);
printLink(ptr);
ListNode * p=FindKthToTail(ptr,1);
if(p)
cout<<p->m_nValue<<endl;
}
//,
void Test6()
{
cout<<"测试用例test6"<<endl;
int a[]={1,2,3,4,5};
ListNode * ptr=CreateLink(a,5);
printLink(ptr);
ListNode * p=FindKthToTail(ptr,4);
if(p)
cout<<p->m_nValue<<endl;
}
void main()
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
}