查找倒数第k位数
题目问题描述:
已知一个带有表头结点的单链表,结点结构为。 假设该链表只给出了头指针 list,在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第 k 个位置上的结点(k为正整数)。若查找成功,算法输出该结点的 data 域的值,并返回 1;否则,只返回 0。。
结果截图:
实现代码:
//查找倒数第k位数
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
int data;
struct Node* next;
}Node, *Linklist;
Linklist creatLink();
void printlist(Linklist L);
int Searchk(Linklist A,int k);
int main(){
int k = 0;
int is = 0;
Linklist A = creatLink();
printf("%倒数k位数: ");
scanf("%d",&k);
is = Searchk(A,k);
if(is == 1)
printf("\n查找成果!\n");
else
printf("\n失败!\n");
}
int Searchk(Linklist A,int k){
int count = 0;
Node* p = A->next;
Node* q = A->next;
while(q){
if(count < k)
count++;
else
p = p->next;
q = q->next;
}
if(count < k){
return 0;
}
else{
printf("%d",p->data);
return 1;
}
}
Linklist creatLink(){
int len,data;
Node* r = NULL;
Linklist L = (Linklist)malloc(sizeof(Node));
L->next = NULL;
L->data = 0;
r = L;
printf("表长: ");
scanf("%d",&len);
printf("表数据:");
for(int i = 0; i < len;i++){
Node* p = (Node*)malloc(sizeof(Node));
getchar();
scanf("%d",&data);
p->data = data;
//尾插法
p->next = NULL;
r->next = p;
r = p;
}
return L;
}
void printlist(Linklist L){
Node* p = L->next;
while(p != L){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}