要求:只使用一次循环
算法思路:使用两个指针p,q;把指针p,q,都指向第一个元素,p先开始向右运动k个位置后
q再开始运动,当p运动到最后一个元素时,此时q指向了倒数第k个元素。
1.查找部分代码
int Search(LinkList L, int k)
{
LNode* p = L->next, * q = L->next; //定义两个指针指向第一个元素
int count = 0; //记录p走了多少
while (p != NULL)
{
if (count < k) //p走的距离小于k,p继续向下运动
count++;
else //当p走到第k个位置q开始运动
q=q->next;
p = p->next; // p,q一起向右运动
}
if (count < k)
return 0;
else
{
printf("%d", q->data);
return 1;
}
}
2.总体测试代码
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
typedef struct LNode
{
int data;
struct LNode* next;
}LNode, * LinkList;
LinkList List_H(LinkList& L) //头插法插入元素
{
LNode* s;
int x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
printf("请输入链表元素的值(输入-1结束)\n:");
scanf_s("%d", &x);
while (x != -1)
{
s = (LNode*)malloc(sizeof(LNode));
s->next = NULL;
s->data = x;
s->next = L->next;
L->next = s;
scanf_s("%d", &x);
}
return L;
}
LinkList PrintfList(LinkList L) //打印元素
{
LNode* p;
p = L->next; //p指向第1号元素
if (p == NULL)
printf("NULL");
else
printf("打印链表中的元素:");
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
return L;
}
int Search(LinkList L, int k)
{
LNode* p = L->next, * q = L->next;
int count = 0;
while (p != NULL)
{
if (count < k)
count++;
else
q=q->next;
p = p->next;
}
if (count < k)
return 0;
else
{
printf("%d", q->data);
return 1;
}
}
int main()
{
int x = 0;
LinkList L;
L = (LinkList)malloc(sizeof(LNode));
List_H(L);
PrintfList(L);
int a = 0;
printf("\n\n请输入需要倒数第几项的元素:");
scanf_s("%d", &a);
printf("\n打印倒数第%d项的元素:",a);
int y = Search(L, a);
return 0;
}