【14】链表中倒数第k个结点
- 时间限制:1秒
- 空间限制:32768K
- 本题知识点: 链表
题目描述
输入一个链表,输出该链表中倒数第k个结点
牛客网题目链接:点击这里题目
vs2010全部代码
#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) {
ListNode* P=pListHead;
ListNode* End=pListHead;
int count=0;
while(End)
{
End=End->next;
count++;
if(count>k)
{
P=P->next;
}
}
if(count<k) return NULL;
else return P;
}
};
//测试用例:6,{1,2,3,4,5}
//对应输出应该为:{}
int main()
{
Solution S1;
ListNode* L1=NULL;
ListNode* PL=NULL;
ListNode* s=NULL;
//创建链表
int n;
cin>>n;
int tmp;
cout<<"输入第"<<1<<"个结点值";
cin>>tmp;
s=new ListNode(tmp);
PL=s; L1=PL;
for(int i=1; i<n; i++)
{
int tmp;
cout<<"输入第"<<i+1<<"个结点值";
cin>>tmp;
s=new ListNode(tmp);
PL->next=s;
PL=PL->next;
}
//输出链表
cout<<endl;
PL=L1;
for(int i=0; i<n; i++)
{
cout<<PL->val<<"->";
PL=PL->next;
}
cout<<endl;
cout<<S1.FindKthToTail(L1,5)->val<<endl;
}
改进的代码:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if(!pListHead || k==0) return NULL;
ListNode* p1=pListHead;k--;
ListNode* p2=NULL;
while(k--){
p1=p1->next;
if(!p1) return NULL;
}
p2=pListHead;
while(p1 && p1->next){
p1=p1->next;
p2=p2->next;
}
return p2;
}
};
考虑三种情况:
1. 输入的pLIstHead为空指针
2. 输入的pListHead为头结点的链表的结点总数少于k
3. 输入的参数k为0.