输入一个链表,输出该链表中倒数第k个结点。
#include<iostream>
#include<vector>
#include<windows.h>
using namespace std;
struct ListNode {
int val;
ListNode *next;
};
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->next!=NULL)
pAhead=pAhead->next;
else
return NULL;
}
pBehind=pListHead;
while(pAhead->next!=NULL)
{
pAhead=pAhead->next;
pBehind=pBehind->next;
}
return pBehind;
}
void MYPrint(ListNode *p) //打印链表
{
while(p!=NULL)
{
cout<<p->val<<" ";
p=p->next;
}
cout<<endl<<endl;
return;
}
int main()
{
int myarray[]={1,2,3,4,5,6,7};
int num=sizeof(myarray)/sizeof(int);
//将数组myarray中的内容传递给链表
//链表
ListNode *head,*p,*lins; //首先建立一个头指针head指向链表的最开始。。当链表还没有建立的时候头指针为空。
head=NULL; //头指针初始为空
for(int i=0;i<=num-1;i++)
{
//建立一个结点,并用临时指针p指向这个结点。
p = new ListNode ;
p->val = myarray[i]; //将数据存储到当前结点的data域中
p->next = NULL; //设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空。
if(head==NULL)
{
head=p; //如果这是第一个创建的结点,则将头指针指向这个结点
}
else
{
lins->next=p; //如果这不是第一个创建的结点,则将上一个结点的后继指针指向当前结点
}
lins=p; //指针lins也指向当前结点.
}
cout<<"链表内容为:"<<endl;
MYPrint(head);
cout<<"倒数第k个结点为:";
cout<<FindKthToTail(head,3 )<<endl;
system("pause");
return 0;
}
输出结果为:
链表内容为:
1 2 3 4 5 6 7
倒数第k个结点为:0xc31250
请按任意键继续. . .