15-链表中倒数第k个结点

一、题目描述

        插入一个链表,输出该链表中倒数第k个结点,为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个结点。

【例如】一个链表有6个结点,从头到尾依次是1、2、3、4、5、6,这个链表的倒数第3个结点是值为4的结点

二、解题思路

一前一后两个指针
设置prev指针,让它先走k-1步,当走到第k步时,back指针从1开始走。当prev指针走到表尾,则back指针指向的元素就是所求倒数第k个结点
【!!注意】
本算法除了要做参数校验(链表非空,k非0)之外,还要考虑避免k大于链表长度的情况,否则算法会崩溃

三、解题算法

/*************************************************************
Author:tmw
date:2018-6-30
**************************************************************/
#include <stdio.h>
#include <stdlib.h>

typedef struct ListNode
{
    int data;
    struct ListNode* next;
}ListNode;

ListNode* find_TailKth_node( ListNode* head, int k )
{
    /**输入参数校验**/
    if( head == NULL || k <=0 )
        return NULL;

    ListNode* prev = head;
    ListNode* back = head;

    int i;
    for( i=1; i<=k-1; i++ )
    {
        if( prev->next != NULL )
            prev = prev->next;
        else
            return NULL;  /**当链表长度少于k时,安全退出**/
    }

    /**保证链表长度>=k的前提下,再挪动back指针**/
    while( prev->next != NULL )
    {
        prev = prev->next;
        back = back->next;
    }
    return back;
}


梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值