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

單鏈表查詢倒數第k個元素

資料結構期末複習的時候遇到的這題,由於看過小甲魚老師的資料結構視訊,首先想到的想法是快慢指標(這裡說雙指標也許更合適),即第一個指標從頭遍歷到第k-1個元素時第二個指標從頭開始遍歷,第一個指標指向結尾時第二個指標即指向倒數第k個元素。寫完後看了一下參考答案,用的是遞迴的方法,感覺兩種方法各有優劣,記下來以便以後學習。
原題目如下:
假設該連結串列只給出了頭指標list.在不改變連結串列的前提下,請設計一個儘可能高效的演算法,查詢連結串列中倒數第k個位置上的結點(k為正整數)。若查詢成功,演算法輸出該結點的data值,並返回1;否則,只返回0。
(1)遞迴呼叫

typedef char
DataType; typedef struct node { DataType data; /*每個元素資料資訊*/ struct node *next; /*存放後繼元素的地址*/ } LNode,*LinkList; int chain_index(LinkList L,unsigned int k) { /*倒數第K個結點*/ static unsigned int ct=-1; static func_value=0;/* 初始定義函式的返回值為0 */ if(k==0)return 0; if(L)chain_index(L->next,k);/*當前結點非空,繼續遞迴呼叫*/
ct++; if(ct= =k){ printf(" %3c\n",L->data); func_value=1; /* 如果ct==k 則函式的返回值置1並且作為最終的返回值 */ } return func_value; }

(2)快慢指標

typedef char DataType;
typedef  struct  node
{  DataType data;  /*每個元素資料資訊*/
   struct node *next;  /*存放後繼元素的地址*/
} LNode,*LinkList;
int
chain_index(LinkList L,unsigned int k) { int i=0; LinkList p=L;//更快的先遍歷k-1次 LinkList q=L; while(p!=NULL) { if(i<k) { p=p->next; } else { p=p->next; q=q->next; } } printf(" %3c\n",q->data); return 1; }