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