#include<stdio.h>
#include<malloc.h>
typedef struct lianbiao{//定义新变量
int data;
struct lianbiao *next;
}*List;//定义
List creatnode(List L);
void search(List L,int k);
int main(){
int k;
scanf("%d",&k);
List head;//不带头结点
head=creatnode(head);
search(head,k);
return 0;
}
List creatnode(List L){
L=NULL;
List p,tail=NULL;
while(1){
p=(List)malloc(sizeof(struct lianbiao));
scanf("%d",&p->data );
if(p->data ==-1)break;
p->next =NULL;
if(L==NULL)L=p;
else tail->next =p;
tail=p;
}
return L;
}
void search(List L,int k){
List p=L;
int cnt=0;
while(p){
cnt++;
p=p->next ;
}
if(k>cnt||k<1){
printf("NULL");
return ;
}
else{
cnt=cnt-k+1;
}
int flag=0;
p=L;////重置
while(p){
flag++;
if(flag==cnt){
printf("%d",p->data );
return ;
}
p=p->next ;
}
}
输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL。。
func FindKthToTail( pHead *ListNode , k int ) *ListNode {
// write code here
if pHead == nil || k<=0{
return nil
}
var index int
var arm *ListNode
other := &ListNode{}
other.Next= pHead
for pHead != nil{
index++
pHead = pHead.Next
if index >= k {
arm = other.Next
other = other.Next
}
}
return arm
}
有两点建议:
1.要学会耍小聪明,在这种网站上做题,你完全可以不用链表,用数组蒙混过关。
2.如果非要链表,建议你用双向循环链表,这样查找快一些,如果k小于长度的一半就倒着找,否则正着找
void search(List L,int k) 函数修改如下,供参考:
#include<stdio.h>
#include<malloc.h>
typedef struct lianbiao {//定义新变量
int data;
struct lianbiao* next;
}*List;//定义
List creatnode(List L);
void search(List L, int k);
int main() {
int k;
scanf("%d", &k);
List head;//不带头结点
head = creatnode(head);
search(head, k);
return 0;
}
List creatnode(List L) {
L = NULL;
List p, tail = NULL;
while (1) {
p = (List)malloc(sizeof(struct lianbiao));
scanf("%d", &p->data);
if (p->data == -1)break;
p->next = NULL;
if (L == NULL)L = p;
else tail->next = p;
tail = p;
}
return L;
}
void search(List L, int k)
{
if (L == NULL || k < 1) {
printf("NULL");
return;
}
List p = L, pr = L;
int cnt = 0;
while (p) {
if (cnt > k - 1)
pr = pr->next;
cnt++;
p = p->next;
}
if (p == NULL && cnt < k)
return;
printf("%d", pr->data);
//return pr;
}
你的链表 没能正确结束,createnode函数中,把 p->next =NULL;这一句放在scanf("%d",&p->data );这一句的前面,createnode函数逻辑也有点问题,修改如下:
List creatnode(List L)
{
L=NULL;
List p,tail=NULL;
while(1){
p=(List)malloc(sizeof(struct lianbiao));
p->next =NULL;
scanf("%d",&p->data );
if(p->data ==-1)break;
if(L==NULL)
{
L=p;
tail = p;
}
else
{
tail->next =p;
tail=p;
}
}
return L;
}
void search(List L,int k)
{
List p=L;
int cnt=0;
while(p)
{
cnt++;
if(k==cnt)
{
printf("%d",p->data);
return;
}
p=p->next ;
}
printf("NULL");
return ;
}