# 2020q3 Homework1 (quiz1) contributed by < `fdfdd12345628` > ## AA1, AA2 在前面的程式已經新增一個node,並且將裡面的初始值都訂好了,因此AA1是為了確認該node是否有效,所以為`assert(new_node)` 接著程式會跑到該list最後,並且加上新的node,因此AA2為`*indirect = new_node`將最後加上新的node ## BB1, BB2 由於要每兩個就交換一次,所以理論上每個迴圈都要把指標改成下下個節點,因此在 for 回圈內的 BB1 要換到下下個節點 又考慮到 node 是 pointer 的 pointer ,因此必須要先 dereference 後,才可以取 next 的 next ,最後 assign 時也要將其取址後,才符合 pointer 的 pointer ,因此 BB1 為`node = &(*node)->next->next` 在迴圈內,已經有 `tmp` 備份 `node` ,所以可以直接將操作自己的 next ,所以BB2為`*node = (*node)->next` `node_t *tmp = *node;` ```graphviz digraph G{ node [shape = record]; current [lable="*node"] tmp -> node0 current -> node0 node0 -> node1 node1 -> node2 } ``` `*node = (*node)->next` ```graphviz digraph G{ node [shape = record]; current [lable="*node"] tmp -> node0 current -> node1 node0 -> node1 node1 -> node2 } ``` `tmp->next = (*node)->next;` ```graphviz digraph G{ node [shape = record]; current [lable="*node"] tmp -> node0 current -> node1 node0 -> node2 node1 -> node2 } ``` `(*node)->next = tmp;` ```graphviz digraph G{ node [shape = record]; current [lable="*node"] tmp -> node0 current -> node1 node0 -> node2 node1 -> node0 } ``` ## CCC 要將linked list進行reverse,所以必須要儲存當下的node,以及前一個node,並且將當下node位址備份起來,把當下node的next指向前一個,並且將當下的node切換成下一個,前一個node也切換成當下,直到結束。 將下一個node位址備份起來 `node_t *next = head->next;` ```graphviz digraph G{ node [shape = record]; cursor -> "node-1" head -> node0 next -> node1 node0 -> node1 } ``` 將當下node指向前一個 `head->next = cursor;` ```graphviz digraph G{ node [shape = record]; next [lable="*node"] head -> node0 cursor -> "node-1" node0 -> "node-1" next -> node1 } ``` 將cursor指向當下,供下次迴圈使用 `cursor = head` ```graphviz digraph G{ node [shape = record]; next [lable="*node"] head -> node0 cursor -> node0 node0 -> "node-1" next -> node1 } ``` 將head指向當下,供下次迴圈使用 `head = next;` ```graphviz digraph G{ node [shape = record]; next [lable="*node"] head -> node1 cursor -> node0 node0 -> "node-1" next -> node1 } ```