#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*
找到⼀个未知长度单链表的倒数第K个节点。
提示:
head—>1—>2—>3—>4—>5—>6—>7—>8—>9—>10—>NULL
其中倒数第0个节点是NULL,倒数第1个节点是10,倒数第10个节点是1.
*/
//第一种方法:先遍历一遍,然后计算链表的长度
// 然后使用指针跳动
//第二中方法:使用两个指针,第二个指针跳k下,然后和第一个指针一起跳,直到第二个指针指向NULL,
// 第一个指针指的就是倒数第k个节点
typedef struct Node
{
int data;
struct Node *next;
}Node;
//从尾部添加节点
void AppendtoEnd(Node *head,int data)
{
Node *new_node=NULL;
Node *temp=NULL;
new_node=malloc(sizeof(Node));
new_node->data=data;
new_node->next=NULL;
//找到最后一个节点
temp=head;
for(;temp->next!=NULL;temp=temp->next);
temp->next=new_node;
}
//打印链表
void ShowList(Node *head)
{
Node *temp=NULL;
if(head==NULL)
{
return ;
}
temp=head->next;
for(;temp!=NULL;temp=temp->next)
{
printf("%d",temp->data);
printf("-->");
}
printf("\n");
}
//实现找到倒数第k个节点
Node *FindLastk(Node *head, int k)
{
Node *first=head;
Node *second=head;
int i=0;
//前指针先走k步
for(i=0;i<k;i++)
{
first=first->next;
}
//两个一起走,直到前指针非法
for(;first!=NULL;first=first->next,second=second->next);
return second;
}
int main(void)
{
int i=0;
int k=10;
Node *k_node=NULL;
Node *head=malloc(sizeof(Node));
head->next=NULL;
for(i=1;i<11;i++)
{
AppendtoEnd(head, i);
}
ShowList(head);
if(k == 0)
{
printf("NULL\n");
}
else
{
k_node=FindLastk(head, k);
printf("倒数第%d个节点是%d\n",k,k_node->data);
}
free(head);
return 0;
}