问题:
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
解答:
#include<stdio.h>
typedef struct ListNode{
int val;
struct ListNode* next;
}ListNode;
ListNode* FindKtoTail( ListNode* head,unsigned int k)
{
//若输入错误
if(head==NULL||k==0)
return NULL;
//定义两个指针,一前一后
ListNode* Ahead=head;
ListNode* Behind=NULL;
//让前面指针先走到k-1处
unsigned int i=0;
for(i;i<k-1;i++)
{
if(Ahead->next!=NULL)
Ahead=Ahead->next;
else
{
return NULL;
}
}
//让后面指针从头开始走,与前面指针相距k-1个位置
Behind=head;
//当前一个指针在尾部,则后一个指针就在倒数第k的位置
while(Ahead->next!=NULL)
{
Ahead=Ahead->next;
Behind=Behind->next;
}
return Behind;
}
int main(int argc, const char *argv[])
{
struct ListNode a,b,c,d,e,*head,*p;
a.val=1;
b.val=2;
c.val=3;
d.val=4;
e.val=5;
head=&a;
a.next=&b;
b.next=&c;
c.next=&d;
d.next=&e;
e.next=NULL;
p=head;
unsigned int k=3;
printf("%d\n",(FindKtoTail(p,k))->val);
return 0;
}