資料結構 演算法設計題 查詢鍊錶倒數第k個元素

2021-10-20 17:51:04 字數 1114 閱讀 2823

已知乙個帶有表頭結點的單鏈表,結點結構為(data, link),假設該鍊錶只給出了頭指標。在不改變鍊錶的前提下,請設計乙個盡可能高效的演算法,查詢鍊錶中倒數第k個位置上的結點。若查詢成功,演算法輸出該結點的data域的值,並返回1;否則,只返回0。要求:

描述演算法的基本設計思想。

描述演算法的詳細實現步驟。

定義指標p和q,初始化均指向單鏈表的首元結點。首先將p沿鍊錶移動到第k個結點,而q保持不動,這樣當p移動到第k+1個結點時,p和q所指的結點間隔距離k。也就是快慢指標。然後p和q同時向後移動,當p為null時,q所指向的結點為鍊錶倒數第k個結點

計數器i=0,指標p和q指向首元結點。

從首元結點開始順著next域遍歷鍊錶,若p為null,則停止遍歷。

若i小於k,則i++;否則q指向向乙個結點。

p指向下乙個結點,轉步驟2

若i等於k,查詢成功,列印p的資料域;否則查詢不成功,返回0。

/*

已知乙個帶有表頭結點的單鏈表,結點結構為(data, link),假設該鍊錶只給出了頭指標。

在不改變鍊錶的前提下,請設計乙個盡可能高效的演算法,查詢鍊錶中倒數第k個位置上的結點。

若查詢成功,演算法輸出該結點的data域的值,並返回1;否則,只返回0。要求:

6. 描述演算法的基本設計思想。

7. 描述演算法的詳細實現步驟。

*/#include

using

namespace std;

typedef

struct lnode lnode,

*linklist;

void

createlist

(linklist &l)

}void

printlist

(linklist l)

cout << endl;

}int

findkelement

(linklist l,

int k)

else

p = p-

>next;}if

(i == k)

// 失敗

return0;

}int

main()

資料結構 演算法設計題 拆分鍊錶

設計演算法將乙個帶頭結點的單鏈表a分解為兩個具有相同結構的鍊錶b和c,其中b表的結點為a表中值小於零的結點,而c表中的結點為a表中值大於零的結點。鍊錶a中的元素為非零整數,要求b c表利用a表的結點。鍊錶b使用鍊錶a的頭結點,鍊錶c申請乙個新的頭結點。對鍊錶a進行遍歷的同時進行拆解,可以使用前插法或...

資料結構 演算法設計題 鍊錶字尾共同空間

採用帶頭結點的單鏈表儲存單詞,當兩個單詞有相同的字尾時,則可以共享相同的字尾儲存空間。例如,loading 和 being 的儲存空間影像如圖。設str1和str2分別指向兩個單詞所在鍊錶的頭結點,鍊錶結點結構為 data,next 請設計乙個時間上盡可能高效的演算法,找出由str1和str2所指的...

資料結構 演算法設計題 合併有序鍊錶2

將兩個非遞減的有序鍊錶合併成乙個非遞增的有序鍊錶。要求鍊錶仍使用原來兩個鍊錶的儲存空間,不另外使用其他的儲存空間,表中執行有重複的元素。與合併有序鍊錶1類似的思路,通過更改結點的指標域來重新建立元素之間的線性關係,得到新鍊錶。有兩個關鍵點 合併的鍊錶與原鍊錶順序相反,利用前插法建立鍊錶,形成遞減序列...