contributed by < sammer1107
>
進階電腦系統理論與實作
根據上面的理解,AA1 不應該是 *indirect = new_node
,否則迴圈執行的結果永遠都是得到 NULL 後結束。因此 AA1 應是 assert(new_node),檢查是否正確取得記憶體。
找到最後一個節點後,需要將最後的 next
指標指向 new_node
。迴圈結束時,*indirect
相當於最後一個節點的 next
,故答案為 *indirect = new_node
。
swap_pair
的功能為兩兩掉換,故 BB1 的功能是要連跳兩個 node。node
而不是 *node
。next
的 type 為 node_t*
,故要再取址才是我們要的。答案為 (e) node = &(*node)->next->next
這樣表示 node
為指向前一節點的 next
的指標,tmp
則為指向第1節點的指標。
next
牽往 node2。做完後長這樣
這裡我們要修改的是前一個 node 的 next
讓他指向 node2 ,故等號左邊應是 *node
,而 node2 的位置為 (*node)->next
(等於 node1 的 next
)。故答案選 (e)要 reverse linked list 我們需要兩個指標一前一後走到底,而 cursor
在這裡就是跟在 head
之後的指標。故選項要選 (b)head->next = cursor; cursor = head
,把 head
的 next
改為指向前一個節點,然後 cursor
和 head
各往前走一步。
做完 head->next = cursor
後
cursor = head
後 head=next
出回圈的樣子
做完 head->next = cursor
後
然後移動指標
之後依此類推
結束時 head
到達最尾端的 NULL
,cursor 則指向最後的節點,也就是新的頭,所以回傳 cursor。
程式碼原理一致,再開頭時新的運作方式變成:
括號 head 代表在 main 中的 head。
head
在這裡很自然的指向了新的頭,所以完全不需要新增程式碼來處理這部份。
這個版本沒做什麼修改,只要將 head
都換成 *head
即可,回傳的動作則改成直接設定 *head
。
此函式是為了包裝 reverse 的呼叫成指標的型式,並會完成最後修改頭的動作。
此函式把 linked list 拆成第一個節點以及後面整串,然後遞迴呼叫翻轉後面整串。
後面翻轉完後回傳的是後面那串新的頭。
再來
目的是要教第一個節點接回到尾巴。
最後再把尾巴的 next
設為 NULL
:
做完就變
回傳 rev_head
就完成了翻轉的動作。
*head
作為新的 list 的頭