# 2020q3 Homework (quiz1) contributed by < `chewei3` > ## add_entry ```c= void add_entry(node_t **head, int new_value) { node_t **indirect = head; node_t *new_node = malloc(sizeof(node_t)); new_node->value = new_value; new_node->next = NULL; AA1; while (*indirect) indirect = &(*indirect)->next; AA2; } ``` ### AA1 ```c= assert(new_node); ``` ### AA2 ```c= *indirect = new_node; ``` ## swap_pair ```c= node_t *swap_pair(node_t *head) { for (node_t **node = &head; *node && (*node)->next; BB1) { node_t *tmp = *node; BB2; tmp->next = (*node)->next; (*node)->next = tmp; } return head; } ``` ### BB1 ```c= node = &(*node)->next->next ``` ### BB2 ```c= *node = (*node)->next; ``` ### swap_pair 的 pointer to pointer 版 ```c= void swap_pair(node_t **head) { for (; *head && (*head)->next; head = &(*head)->next->next) { node_t *tmp = *head; *head = (*head)->next; tmp->next = (*head)->next; (*head)->next = tmp; } } ``` ## reverse ```c= node_t *reverse(node_t *head) { node_t *cursor = NULL; while (head) { node_t *next = head->next; CCC; head = next; } return cursor; } ``` ### CCC ```c= head->next = cursor; cursor = head; ``` ### reverse 的 pointer to pointer 版本 ```c= void reverse(node_t **head) { node_t *cursor = NULL; while (*head) { node_t *next = (*head)->next; (*head)->next = cursor; cursor = *head; *head = next; } *head = cursor; } ``` ### recursive reverse ```c= void rev_recursive(node_t **head, node_t *cur) { if (!cur) return; if (!cur->next) { *head = cur; return; } rev_recursive(head, cur->next); cur->next->next = cur; cur->next = NULL; } ```