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

取單鏈表倒數第k個元素


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.演算法實現

int 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;
}
原始碼下載:http://download.csdn.net/detail/algorithm_only/3890784