單鏈表查詢倒數第k個元素
阿新 • • 發佈:2019-01-02
資料結構期末複習的時候遇到的這題,由於看過小甲魚老師的資料結構視訊,首先想到的想法是快慢指標(這裡說雙指標也許更合適),即第一個指標從頭遍歷到第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;
}