1. 程式人生 > >求鏈式線性表的倒數第K項 (20 分)

求鏈式線性表的倒數第K項 (20 分)

7-118 求鏈式線性表的倒數第K項 (20 分)

給定一系列正整數,請設計一個儘可能高效的演算法,查詢倒數第K個位置上的數字。

輸入格式:

輸入首先給出一個正整數K,隨後是若干正整數,最後以一個負整數表示結尾(該負數不算在序列內,不要處理)。

輸出格式:

輸出倒數第K個位置上的資料。如果這個位置不存在,輸出錯誤資訊NULL

輸入樣例:

4 1 2 3 4 5 6 7 8 9 0 -1

輸出樣例:

7

 解析:

有一個樣例超時過不了,其他的過了

大體思路就是把要查詢的那個陣列倒過來正著找,也可以直接倒著找,總之要用STLvector

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
    vector<int> ss;
    int n;
    scanf("%d ",&n);
    int t,i;
    int count=0;
    while(scanf("%d",&t))
    {
        if(t!=-1)
        {
            ss.push_back(t);
            count++;
        }
        else
            break;
    }
    //reverse(ss.begin()+1,ss.end());
    for(i = ss.size();i >= 0;i--)
    {
        if(i==ss.size()-n)
            cout<<ss[i];
    }
    if(n>count)
        cout<<"NULL"<<endl;
}

再給一個全對的網上找的

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int main() {
    int  k , cnt=0,tmp,flag=0,found = 0;
    cin>>k;
    int* num=(int*)malloc(sizeof(int)*k); //只存k個正整數
    while(1)
    {
        scanf("%d",&tmp);
        if(tmp<0)                         //tmp為-1退出迴圈
            break;
        num[cnt++]=tmp;
        if(!found&&cnt>=k)
            found=1;
        cnt%=k;
        
    }
    if(found==0)
        printf("NULL");
    else
        printf("%d",num[cnt]);//輸出位於最後輸入的元素的下一個元素,因為最後輸入的元素就是倒數第一個元素,cnt++後指向它的下一個元素,只存了k個,所以它的下一個就是倒數第k個了
    return 0;
}