求同方案的另一个解决方法?

img

img


假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。若查找成功,算法输出该结点的值,否则输出-1
【输入形式】

第一个数是k,后面的依次是链表元素
【输出形式】

找到的值
【样例输入】

1 2 3 4 5 6 7 8 9 0
【样例输出】

0
【样例说明】

倒数第1个数是0
要求:

不得求出数组长度

供参考:

#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; // 输入 -1 结束链表元素输入
        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("-1");
        return;
    }
    List p = L, pr = L;
    int cnt = 0;
    while (p) {
        if (cnt > k - 1)
            pr = pr->next;
        cnt++;
        p = p->next;
    }
    if (cnt < k)
        printf("-1");
    else
        printf("%d", pr->data);
}

img

img

需要把链表遍历一遍,遍历过程把每一个元素放入栈中,遍历完,取倒数第几个,就弹出几次,最后一个弹出的元素就是需要的,如果不够弹,就返回-1

你给的代码对吗?跑跑试试了吗?