原题链接
这道题的两种解法:
- 设置一个前置指针,指向当前结点的前k个结点
- 采用头插法,从前向后数k个(效率更高,更简单)
下面依次给出两种解法的代码:
第一种解法:
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
struct node *next;
int data;
}lnode;
void init(lnode **l){
(*l)=(lnode *)malloc(sizeof(lnode));
(*l)->next=NULL;
}
lnode* insert(lnode *l,int x){
lnode *p;
p=(lnode *)malloc(sizeof(lnode));
p->next=NULL;
p->data=x;
l->next=p;
return p;
}
void pp(lnode *l){
lnode *p=l->next;
if(p!=NULL){
printf("%d ");
p=p->next;
}
}
int main(){
lnode *l,*p,*q;;
init(&l);
p=l;
int a,k,i=0,j=0;
scanf("%d",&k);
scanf("%d",&a);
while(a>=0){
p=insert(p,a);
scanf("%d",&a);
j++;
}
if(j<k){
printf("NULL");
}else{
p=l;
while(i<k && p!=NULL){
p=p->next;
i++;
}
q=l;
while(p!=NULL){
p=p->next;
q=q->next;
}
printf("%d",q->data);
}
return 0;
}
第二种解法
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int elem;
struct node *next;
}lnode;
void lnodeinit(lnode **l){
(*l)=(lnode *)malloc(sizeof(lnode));
(*l)->next=NULL;
}
void headinsert(lnode *l,int e){
lnode *p=l,*q;
q=(lnode *)malloc(sizeof(lnode));
q->elem=e;
q->next=p->next;
p->next=q;
}
int main(){
int k,i=0;
lnode *l,*p;
lnodeinit(&l);
scanf("%d",&k);
while(i>=0){
scanf("%d",&i);
headinsert(l,i);
}
p=l->next;
for(i=0;i<k && p!=NULL;i++){
p=p->next;
}
if(p==NULL){
printf("NULL");
}else{
printf("%d",p->elem);
}
}