一、题目描述:
二、算法思想:
本算法的关键在于利用两个指针,一个指针用来遍历计数,另一个指针用来指向n-k个值,即倒数第k个值。
三、核心代码:
int search_k(int k,link*head)
{
link*p=head->next;
link*q=head->next;
int counter=0;
while(p!=NULL)
{
if(counter<k)
{
counter++;
}
else//第k个值之后开始移动,所以当到链表结束后刚好移动到n-k个位置,即实现倒数第k的功能
{
q=q->next;
}
p=p->next;//p指针不断完后移动,使得遍历进行
}
if(counter<k)
return 0;
else
{
printf("k=%d,data=%d\n",k,q->data);
return 1;
}
}
四、完整代码:
#include<stdio.h>
#include<stdlib.h>
struct link*AppendNode(struct link*head);
void DisplyNode(struct link*head);
void DeleteMemory(struct link*head);
int search_k(int k,link*head);
struct link{
int data;
struct link*next;
};
int main()
{
int i=0;
int k;
char c;
struct link*head=NULL;
printf("do you want to append a new node(Y/N)?");
scanf("%c",&c);
while(c=='Y'||c=='y')
{
head=AppendNode(head);//向head为头指针的链表末尾添加节点
DisplyNode(head);
printf("do you want to append a new node(Y/N)?");
scanf(" %c",&c);
i++;
}
printf("%d new nodes have been apended!\n",i);
//实现算法的核心功能
printf("please input k:");
scanf("%d",&k);
search_k(k,head);
//回收内存
DeleteMemory(head);
return 0;
}
//函数功能:新建一个节点并添加到链表末尾,返回添加节点后的表头指针
struct link*AppendNode(struct link*head)
{
struct link*p=NULL;
struct link*pr=head;
int data;
p=(struct link*)malloc(sizeof(struct link));
if(p==NULL)
{
printf("no enough memory to allocate!\n");
exit(0);
}
if(head==NULL)
{
head=p;
}
else
{
while(pr->next!=NULL)
{
pr=pr->next;
}
pr->next=p;
}
printf("input node data:");
scanf("%d",&data);
p->data=data;
p->next=NULL;
return head;
}
//显示链表中所有节点的节点好和该节点中的数据项内容
void DisplyNode(struct link*head)
{
struct link*p=head;
int j=1;
while(p!=NULL)
{
printf("%5d%10d\n",j,p->data);
p=p->next;
j++;
}
}
//释放head指向链表中的所有节点所占用的内存
void DeleteMemory(struct link*head)
{
struct link*p=head;
struct link*pr=NULL;
while(p!=NULL)
{
pr=p;
p=p->next;
free(pr);
}
}
//返回链表中倒数第K个节点的值
int search_k(int k,link*head)
{
link*p=head->next;
link*q=head->next;
int counter=0;
while(p!=NULL)
{
if(counter<k)
{
counter++;
}
else//第k个值之后开始移动,所以当到链表结束后刚好移动到n-k个位置,即实现倒数第k的功能
{
q=q->next;
}
p=p->next;
}
if(counter<k)
return 0;
else
{
printf("k=%d,data=%d\n",k,q->data);
return 1;
}
}
五、测试分析: