# 你所不知道的 C 語言: linked list 和非連續記憶體 - 筆記 Jserv的教材[https://hackmd.io/@sysprog/c-linked-list](https://) ```javascript= void remove_list_node(List *list, Node *target) { Node *prev = NULL; Node *current = list->head; // Walk the list while (current != target) { prev = current; current = current->next; } // Remove the target by updating the head or the previous node. if (!prev) list->head = target->next; else prev->next = target->next; } ``` 其中的==if (!prev)==是針對如果是第一筆資料的情況,==else==則是指==中間的資料== * 有品味的版本,指標的指標 (或稱「間接指標」,即 indirect pointer) ```java= void remove_list_node(List *list, Node *target) { // The "indirect" pointer points to the *address* // of the thing we'll update. Node **indirect = &list->head; // Walk the list, looking for the thing that // points to the node we want to remove. while (*indirect != target) indirect = &(*indirect)->next; *indirect = target->next; } ``` ```javascript= indirect = &(*indirect)->next; ``` 其中這裡是先取得(*indirect)的==next==接著再去取位址 可參考這裡[https://hackmd.io/@sysprog/c-pointer](https://),幫助理解原理 以下部分不太理解 ```javascript= static inline Node *move(Node *cur) { return cur ? cur->next : NULL; } bool cycle_finding(Node *HEAD, Node **TAIL, int *length, int *mu, int *lambda) { // lambda is length // mu is the meet node's index Node *tortoise = move(HEAD); Node *hare = move(move(HEAD)); // get meet point while (hare && tortoise) { /* Maybe while (hare && tortoise && (hare != tortoise)) ?*/ tortoise = move(tortoise); hare = move(move(hare)); } // not loop if (!hare) { *TAIL = NULL; *length = 0; tortoise = HEAD; while (tortoise && (tortoise = move(tortoise))) (*length)++; return false; } // get mu *mu = 0; tortoise = HEAD; while (tortoise != hare) { (*mu)++; tortoise = tortoise->next; hare = hare->next; } // get lambda *lambda = 1; tortoise = move(tortoise); *TAIL = tortoise; while (tortoise != hare) { *TAIL = tortoise; (*lambda)++; tortoise = move(tortoise); } *length = *mu + *lambda; return true; } ```