.已知乙個帶有表頭結點的單鏈表,結點結構為:
data
link
假設該鍊錶只給出了頭指標list,在不改變鍊錶前提下,請設計乙個盡可能高效的演算法,查詢鍊錶中導數第k個位置上的結點(k為正整數)。若查詢成功,演算法輸出為該節點的data域的值,並返回1,;否則,只返回0.要求:
描述演算法的基本設計思想;
描述演算法的詳細實現步驟;
根據設計思想和實現步驟,採用程式語言描述演算法,關鍵之處請給出簡要注釋。
解答:基本設計思想:定義兩個指標p,q,初始時均指向頭結點的下乙個結點,及鍊錶的頭結點。p指標沿著鍊錶移動,當p指向第k個結點時,q指標開始與p指標同步移動,當p指標移動到最後乙個節點時,q指標所指示的結點導數第k個結點。以上過程對鍊錶進進行一遍掃瞄。
基本步驟略寫。
演算法實現**如下:codeblocks12.11+gcc
//查詢倒數第k個結點
typedef int elemtype;
typedef struct lnode
*linklist;
int search_k(linklist listhead ,int k)
if (count < k)
else
}
題目:已知乙個帶有頭結點的單鏈表,設計乙個高效演算法實現該單鏈表的逆轉演算法。
解答:演算法說明:略
演算法實現**:
linklist linkreverse(linklist listhead)
linklist tmp = null,
pre = null,
cur = listhead -> link;
while(cur != null)
listhead ->link = pre;
return listhead;
}
執行環境codeblocks12.11 +gcc
#include #include typedef int elemtype;
typedef struct lnode
*linklist;
/*查詢倒數第k個結點*/
int search_k(linklist listhead ,int k)
if (count < k)
else
}/* 鍊錶逆轉 */
linklist linkreverse(linklist listhead)
linklist tmp = null,
pre = null,
cur = listhead -> link;
while(cur != null)
listhead ->link = pre;
return listhead;
}int main()
else
}linklist listhead = (linklist) malloc( sizeof(struct lnode) );
listhead -> link = listnode[9];
linklist tmp = listhead -> link ;
while(tmp != null)
printf("\n");
linkreverse(listhead);
tmp = listhead -> link ;
while(tmp != null)
printf("\n");
search_k(listhead, 1);
return 1;
}
Leetcode 鍊錶題目
鍊錶是個線性資料結構 由零個或多個資料元素組成的有限序列 第乙個元素無前驅,最後乙個元素沒有後繼,其餘元素乙個前驅乙個後繼 leetcode 160 找出兩個鍊錶的交點 本題中要找出兩條鍊錶的交點,首先要知道鍊錶的特性,下乙個節點的位置只能由上乙個節點來確定,所以不能直接確定某個值得特定的位置,因此...
鍊錶專題彙總
排序兩個鍊錶 一文搞懂鍊錶 前言 之前考研的時候因為基礎不紮實,所以演算法題大多靠背,but 熟練度是一方面,總結方法也要跟上,這樣才能起到舉一反三的效果。tips 如果不知道思路,可以先舉乙個例子模擬一下 1 虛擬頭節點 建乙個虛擬節點更讓容易表示節點,這樣鍊錶的每個節點都是公平的,對於空鍊錶也更...
常用演算法題目總結三(鍊錶篇)
只遍歷一次鍊錶時如何實現呢?示例 templatestruct node 鍊錶節點 template void printlist node head 列印鍊錶 cout endl templatenode constructlist int n 構造鍊錶 return head templaten...