1. 程式人生 > >查詢單鏈表的倒數第K個元素

查詢單鏈表的倒數第K個元素

有兩種演算法可以實現,此處給出效率較高的一種方法。

演算法思想:設定雙指標,p1和p2,先讓p1指標從頭開始遍歷k-1個節點,然後讓p1繼續遍歷,p2從頭遍歷(p1和p2同時遍歷),當p1遍歷到連結串列的末尾,此時p2指標所指向的正好是倒數第k個節點。
如:
head–>1–>2–>3–>4–>5–>6–>7–>8–>9–>10–>NULL

其中倒數第0個節點是NULL,倒數第1個節點是10,倒數第10個節點是1

  • 延伸
    求出一個排序完畢的陣列中,相同數目元素出現次數大於100的元素.
    這也需要一個視窗機制.即比較a[i] 與a[i+100]兩個元素即可.

C語言結構體和指標實現

#include <stdio.h>
#include <stdlib.h>

typedef struct node{
    int number;
    struct node * next;
}Node;

int getK(Node *link,int k);

int main(){

    int n,k,i,temp;
    int flag;
    printf("Input link's length and countdown element: ");
    while(scanf("%d %d",&n,&k)!=EOF && n>=0
&& n<=1000 && k>=0 && k<=1000 ){ Node *link = (Node *)malloc(sizeof(Node)); link->next = NULL; flag = 0; Node *tail; tail = link; printf("Input elements: "); for(i=0;i<n;i++){ scanf("%d",&temp); Node *n
= (Node *)malloc(sizeof(Node)); n->next = tail->next; tail->next = n; tail = tail->next; n->number = temp; } int dataK = getK(link,k); dataK == -1?printf("NULL\n"):printf("The countdown of %d element: %d\n",k,dataK); } return 0; } int getK(Node *link,int k){ Node *p1,*p2; int i; if(link->next == NULL || k <= 0) return -1; p1 = link->next; for(i=0;i < k-1;i++){ //k-1 if(p1->next == NULL) return -1; p1 = p1->next; } p2 = link->next; while(p1->next != NULL){ p1 = p1->next; p2 = p2->next; } return p2->number; }

執行結果:
輸入連結串列長度為7,查詢倒數第3個元素,輸入連結串列可看到返回結果。
這裡寫圖片描述