求链表倒数第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){
    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 ;
    }
    
}

img

输出倒数第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 ;

}