使用靜態鍊錶解決複雜問題的步驟

2021-09-26 05:43:18 字數 1157 閱讀 1752

**如下:

struct nodenode[100010];
上面的定義中,我們把結點的位址、資料域、指標域都進行了定義,並且留了乙個***來適應不同的題目(例如可以設定為結點是否為鍊錶上的乙個結點)

在程式的開始,對靜態鍊錶進行初始化。一般來說,需要對定義中的***進行初始化,將其定義為正常情況下達不到的數字(一般來說需要小於所有能達到的數字,理由在第四步中說明)例如對結點是否在鍊錶上這個性質來說,我們可以初始化為0(即false),表示結點不在鍊錶上。

for(int i=0;i題目一般都會給出一條鍊錶的首結點的位址,那麼我們就可以依據這個位址來遍歷得到整條鍊錶。需要注意的是,這一步同時也是我們對結點的性質***進行標記,並且對有效結點的個數進行計數的時候,例如對結點是否在鍊錶上這個性質來說,當我們遍歷鍊錶時,就可以把***置為1,即true

int p=begin,count=0;

while(p!=-1)

由於使用靜態鍊錶時,是直接採用位址對映(hash)的方式,這就會使得陣列下標的不連續,而很多時候題目中給出的結點並不都是有效結點(即可能存在不在鍊錶上的結點)。為了能夠可控的訪問有效結點,一般都需要對陣列進行排序以把有效結點移到陣列左端,這樣就可以用步驟3的count來訪問它們;

既然需要把有效結點移到前面,那麼就可以利用之前定義的***來幫忙,在步驟2中,***需要被初始化為比正常結點的***取值要小的數值,這個做法就可以在這一步起到作用吧,由於無效結點的***在步驟3中不會被修改,因此一定比有效結點的***小。於是在寫sort的排序函式cmp時,就可以在cmp的兩個引數結點中有無結點時按***從大到小排序,這樣就可以把有效結點全部移到陣列的左端。

一般來說,題目中還會有額外的要求,因此,cmp函式都需要有二級排序,不過這需要看具體的題目,例如:如果題目的要求需要把鍊錶按照結點順序排序,就需要在cmp函式中建立第二級排序,即在cmp的兩個引數結點中有無效結點時按***從大到小排序,而當兩個結點都是有效結點時,按照結點在鍊錶中的位置從小到大排序(結點的順序可以在第三步中得到)

bool cmp(node a,node b)else

}

在經歷了步驟四之後,鍊錶中的有效結點就都在陣列的左端了,且已經按照結點的性質進行了排序,接下來就是看題目的具體要求(比較常見的是按照各種不同的要求來輸出鍊錶)

(複雜問題分步驟)劍指 複雜鍊錶的複製

輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 占用記憶體 9400k public class randomlistnode publi...

使用鍊錶解決約瑟夫環問題

1139 約瑟夫環問題 時間限制 500ms 記憶體限制 65536k 提交次數 157 通過次數 79 題型 程式設計題 語言 g gcc description 約瑟夫 josephus 環是這樣的 假設有n個小孩圍坐成乙個圓圈,並從1開始依次給每個小孩編上號碼。老師指定從第s位小孩起從1開始報...

分析讓複雜問題簡單 複雜鍊錶的複製

輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 思路 1,如果鍊錶為空鍊錶,則返回本身即可。2,如果鍊錶非空的情況 如果沒有特殊指標,則只...