您的位置:首页 > 其它

【14】链表中倒数第k个结点

2016-06-24 10:31 309 查看

【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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表