建立單向鏈表并遍歷 有什么好的辦法記住鏈表翻轉(zhuǎn)?
有什么好的辦法記住鏈表翻轉(zhuǎn)?如果讓我看鏈表翻轉(zhuǎn)的代碼的話,我可以看懂。但是怎么都記不住鏈表翻轉(zhuǎn)的邏輯。單鏈表,官方釋義為:是一種鏈?zhǔn)酱嫒〉臄?shù)據(jù)結(jié)構(gòu),用一組地址任意的存儲(chǔ)單元存放線性表中的數(shù)據(jù)元素。鏈表
有什么好的辦法記住鏈表翻轉(zhuǎn)?
如果讓我看鏈表翻轉(zhuǎn)的代碼的話,我可以看懂。但是怎么都記不住鏈表翻轉(zhuǎn)的邏輯。
單鏈表,官方釋義為:是一種鏈?zhǔn)酱嫒〉臄?shù)據(jù)結(jié)構(gòu),用一組地址任意的存儲(chǔ)單元存放線性表中的數(shù)據(jù)元素。鏈表中的數(shù)據(jù)是以結(jié)點(diǎn)來(lái)表示的,每個(gè)結(jié)點(diǎn)的構(gòu)成:元素(數(shù)據(jù)元素的映象) 指針(指示后繼元素存儲(chǔ)位置),元素就是存儲(chǔ)數(shù)據(jù)的存儲(chǔ)單元,指針就是連接每個(gè)結(jié)點(diǎn)的地址數(shù)據(jù)。如圖:
單鏈?zhǔn)菃蜗虻?,只能單向訪問(wèn),現(xiàn)需要將鏈表翻轉(zhuǎn)過(guò)來(lái),也就是說(shuō)next指針要反向。
1、簡(jiǎn)單思路:當(dāng)然這里有個(gè)簡(jiǎn)單的思路:遍歷一遍鏈表,將每個(gè)元素都存儲(chǔ)進(jìn)vector容器,然后反向迭代vector的每個(gè)元素,并將元素的next指針指向容器中前一個(gè)元素。這是最簡(jiǎn)單的,實(shí)現(xiàn)起來(lái)也十分好理解;
但是這種并不是鵝廠想要的,因?yàn)樗麄兿肟嫉氖敲嬖囌邔?duì)鏈表數(shù)據(jù)結(jié)構(gòu)的理解程度,以及邏輯思維的深度。
2、從鏈表角度的思路單鏈表反轉(zhuǎn),我們需要處理的就是當(dāng)前節(jié)點(diǎn)、當(dāng)前節(jié)點(diǎn)前一個(gè)節(jié)點(diǎn)、當(dāng)前節(jié)點(diǎn)后一個(gè)節(jié)點(diǎn),這三個(gè)節(jié)點(diǎn)之間的邏輯關(guān)系(node_head、node_temp_pre、node_temp_next)。其實(shí)我們只需要將頭指針逐步順著鏈表往后移,并且在移動(dòng)過(guò)程中,改變next的指向。
思路實(shí)現(xiàn)關(guān)鍵點(diǎn):
首先我們得在改變當(dāng)前節(jié)點(diǎn)next指向之前將next指向的節(jié)點(diǎn)訪問(wèn)出來(lái)并通過(guò)指針保存起來(lái),不然當(dāng)當(dāng)前節(jié)點(diǎn)的next指向改變?cè)賮?lái)訪問(wèn)就訪問(wèn)不到了
然后將next指向node_temp_pre(之前保存的前一個(gè)節(jié)點(diǎn))
再然后要做好準(zhǔn)備將head往后移動(dòng)一位,將當(dāng)前節(jié)點(diǎn)賦值給node_temp_pre,作為后續(xù)節(jié)點(diǎn)的next節(jié)點(diǎn)
最后移動(dòng)head
題解
這樣您應(yīng)該可以很清楚的記住翻轉(zhuǎn)鏈表的實(shí)現(xiàn)方法了吧!
循環(huán)鏈表是什么?
將單向鏈表終端結(jié)點(diǎn)的指針端由空指針改為向頭結(jié)點(diǎn),使整個(gè)單鏈表形成一個(gè)環(huán),這種頭尾相接的單鏈表稱為單循環(huán)鏈表,簡(jiǎn)稱循環(huán)鏈表。它的特點(diǎn)是表中最后一個(gè)結(jié)點(diǎn)的指針域指向頭結(jié)點(diǎn),整個(gè)鏈表形成一個(gè)環(huán)。
cxq啥意思?
cxq 是ContentionList,競(jìng)爭(zhēng)列表的簡(jiǎn)稱的意思。它是一個(gè)單向鏈表。被掛起線程等待重新競(jìng)爭(zhēng)鎖的鏈表, monitor 通過(guò)CAS將包裝成ObjectWaiter寫(xiě)入到列表的頭部。為了避免插入和取出元素的競(jìng)爭(zhēng),所以O(shè)wner會(huì)從列表尾部取元素。