手写函数时,可以按照以下步骤进行:
明确函数功能
在开始写函数之前,首先要清楚函数的功能是什么。这有助于你在编写过程中保持思路清晰。
列出流程
将函数分解成几个小部分,并逐一分析每个部分的功能。这有助于你更好地组织代码,并确保每个部分都能正确执行。
定义变量
为每个功能部分定义清晰的变量名,确保每个变量都有其特定的作用。这有助于提高代码的可读性和可维护性。
编写代码
根据流程和变量定义,逐步编写代码。确保每一步都清晰明了,并遵循良好的编程习惯。
测试函数
在编写完代码后,进行充分的测试,确保函数在各种情况下都能正确运行。
```c
include include // 定义链表节点结构 typedef struct ListNode { int val; struct ListNode *next; } ListNode; // 函数声明 void removeDuplicates(ListNode head_ref); int main() { // 创建链表 ListNode *head = (ListNode *)malloc(sizeof(ListNode)); head->val = 1; head->next = (ListNode *)malloc(sizeof(ListNode)); head->next->val = 2; head->next->next = (ListNode *)malloc(sizeof(ListNode)); head->next->next->val = 2; head->next->next->next = (ListNode *)malloc(sizeof(ListNode)); head->next->next->next->val = 3; head->next->next->next->next = NULL; // 调用函数删除重复元素 removeDuplicates(&head); // 打印链表 ListNode *temp = head; while (temp != NULL) { printf("%d ", temp->val); temp = temp->next; } printf("\n"); return 0; } // 函数定义 void removeDuplicates(ListNode head_ref) { if (*head_ref == NULL) return; ListNode *current = *head_ref; ListNode *next = current->next; ListNode *prev = NULL; while (next != NULL) { if (current->val == next->val) { // 删除重复元素 if (prev == NULL) { *head_ref = next->next; } else { prev->next = next->next; } free(next); } else { prev = current; } current = next; next = next->next; } } ``` 在这个示例中,我们首先定义了一个链表节点结构 `ListNode`,然后实现了一个 `removeDuplicates` 函数来删除链表中的重复元素。函数的主要步骤包括: 检查链表头指针是否为空,如果为空则直接返回。 使用两个指针 `current` 和 `next` 遍历链表,比较当前节点和下一个节点的值。 如果发现重复元素,则删除下一个节点,并更新指针。 在遍历过程中,更新 `prev` 指针以保持链表的连续性。 通过这种方式,你可以清晰地组织代码,并确保函数能够正确执行。初始化:
遍历链表:
删除重复元素:
更新指针: