取單鏈表倒數第k個元素
阿新 • • 發佈:2019-01-05
1.演算法要求
已知一個帶有表頭結點的單鏈表,結點結構為
typedef struct lnode {
elemtype data;
struct lnode *next;
}lnode, *linklist;
假設該連結串列只給出了頭指標l.在不改變連結串列的前提下,請設計一個儘可能高效的演算法,查詢連結串列中倒數第k 個位置上的結點(k 為正整數).若查詢成功,演算法輸出該結點的data 值。
2.演算法基本思想
從頭至尾遍歷單鏈表,並用指標P指向當前節點的前K個節點。當遍歷到連結串列的最後一個節點時,指標P所指向的節點即為所查詢的節點。
3. 詳細實現步驟
增加兩個指標變數和一個整型變數,從連結串列頭向後遍歷,其中指標P1指向當前遍歷的節點,指標P指向P1所指向節點的前K個節點,如果P1之前沒有K個節點,那麼P指向表頭節點。用整型變數i表示當前遍歷了多少節點,當i>k時,指標p隨著每次遍歷,也向前移動一個節點。當遍歷完成時,p或者指向表頭就節點,或者指向連結串列中倒數第K個位置上的節點。
4.演算法實現
原始碼下載:http://download.csdn.net/detail/algorithm_only/3890784int get_node(linklist l, int k) { linklist p, q; int i = 1; p = l->next; q = l; while (p) { p = p->next; ++i; if (i > k) /* 當i大於k時, 其後移, 保證q是當前結點的前面第k個元素 */ q = q->next; } if (q == l) /* q指標沒移動,說明當前連結串列沒有k個元素 */ return ERROR; return q->data; }