一、题目描述
插入一个链表,输出该链表中倒数第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;
}
梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~~