OJ刷题笔记 19079 输出链表倒数第K个元素

19079 输出链表倒数第K个元素

Description
输入一个长度为 n 的链表,设链表中的元素的值为 ai ,输出该链表中倒数第k个节点。
如果该链表长度小于k,输出-1。

#include //C++
using namespace std;
struct LNode
{
int data;
LNode * next;
};
void createList(LNode * &L,int n)
{/< 尾插法创建单链表 */
LNode *r, *p;
r=L=new LNode;/
< 创建头结点 */
L->next=NULL;
for(int i=1;i<=n;i++)
{
p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
void trv(LNode * L)
{ /**< 一个简单的链表遍历函数,供编程过程中测试使用 */
L=L->next;
while(L)
{
cout<data<<’ ';
L=L->next;
}
}
int getK(LNode * L,int k)
{


}
int main()
{
int n,k;
LNode *L;
cin>>n>>k;
createList(L,n);
//trv(L);
cout<<getK(L,k);
return 0;
}

输入格式
第一行两个整数,分别为n和k。
第二行n个整数。

输出格式
倒数第k个元素,如果不存在,输出-1。

输入样例
5 2
1 2 3 4 5

输出样例
4;

思路:定义两个指针,先让快指针走k步,然后快慢指针以一样的速度一起走,这样快慢指针之间的距离始终为k,等快指针走到空的时候,慢指针指向的就是倒数第k个节点。

填空:

    LNode *fast = L->next;
    LNode *slow = L->next;
    while(k>0 && fast != NULL){ //fast走k步停下,或者走到表尾(因为k有可能大于链表长度,所以要加个条件fast != null防止fast一直走)
        fast = fast->next;
        k--;//k--不能写到while条件内
    }
    //快慢指针相差k步,fast遍历到表尾时,slow在倒数第k位
    while(fast != NULL){
        fast = fast->next;
        slow = slow->next;
    }
    return k > 0 ? -1 : slow->data;//k>0说明k超过链表长度,返回-1

完整代码:

#include <iostream>//C++ 
using namespace std; 
struct LNode 
{ 
    int data; 
    LNode * next; 
}; 
void createList(LNode * &L,int n) 
{/**< 尾插法创建单链表 */ 
    LNode *r, *p; 
    r=L=new LNode;/**< 创建头结点 */ 
    L->next=NULL; 
    for(int i=1;i<=n;i++) 
    { 
        p=new LNode; 
        cin>>p->data; 
        p->next=NULL; 
        r->next=p; 
        r=p; 
    } 
} 
void trv(LNode * L) 
{ /**< 一个简单的链表遍历函数,供编程过程中测试使用 */ 
    L=L->next; 
    while(L) 
    { 
        cout<<L->data<<' '; 
        L=L->next; 
    } 
} 
int getK(LNode * L,int k) 
{ 
    LNode *fast = L -> next;
    LNode *slow = L -> next;
    while(k > 0 && fast != NULL)//k有可能大于链表长度,所以要加个条件fast != null防止fast一直走
    {
        fast = fast -> next;
        k--;
    }
    while(fast != NULL)
    {
        fast = fast -> next;
        slow = slow -> next;
    }
    return k > 0 ? -1 : slow->data;//k没减到0,说明k大于链表长度,返回-1
}
int main() 
{ 
    int n,k; 
    LNode *L; 
    cin>>n>>k; 
    createList(L,n); 
    //trv(L); 
    cout<<getK(L,k); 
    return 0; 
} 
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值