C语言LeetCode单链表题适配给定原型实现头插节点的方法
单链表头插实现适配题目接口的问题
我在跟着LeetCode单链表章节的指引用C语言从零实现单链表结构,当前推进到「在链表头部新增节点」的实现环节,遇到了实现逻辑和题目接口规范不匹配的问题。
题目给定的接口调用规范
题目明确说明,最终的接口会按照以下规则被调用:
/** * Your MyLinkedList struct will be instantiated and called as such: * MyLinkedList* obj = myLinkedListCreate(); * myLinkedListAddAtHead(obj, val); **/
之前尝试的实现方案与存在的问题
第一版:二级指针实现头插
我最开始预想的主函数调用逻辑是这样的(暂时不考虑内存泄漏问题):
int main(void) { MyLinkedList *head; head = myLinkedListCreate(); myLinkedListAddAtHead(&head, 10); myLinkedListAddAtHead(&head, 9); myLinkedListAddAtHead(&head, 8); return (0); }
按照这个逻辑写的实现代码存在两个核心问题:
- 链表创建函数逻辑写反:malloc申请到有效内存后直接把指针置为NULL,完全浪费了申请的内存空间
- 头插函数的入参用了二级指针
MyLinkedList **obj,和题目要求的单级指针对不上
对应的问题代码片段:
#include <stddef.h> #include <stdlib.h> typedef struct MyLinkedList_s { int data; struct MyLinkedList_s *next; } MyLinkedList; MyLinkedList* create() { MyLinkedList *node; node = (MyLinkedList *)malloc(sizeof(MyLinkedList)); if (!node) return (NULL); node = NULL; // 错误逻辑:申请到的有效内存被直接置空 return (node); } void myLinkedListAddAtHead(MyLinkedList **obj, int val) { MyLinkedList *tmp; tmp = (MyLinkedList *)malloc(sizeof(MyLinkedList)); if (!tmp) return ; tmp->data = val; tmp->next = *obj; *obj = tmp; }
第二版:返回值带回新头指针
为了适配单级指针的入参要求,我尝试把头插函数的返回值改成链表指针类型,靠返回值把新的头节点回传出去:
MyLinkedList *myLinkedListAddAtHead(MyLinkedList *obj, int val) { MyLinkedList *tmp; tmp = (MyLinkedList *)malloc(sizeof(MyLinkedList)); if (!tmp) return ; tmp->data = val; tmp->next = obj; obj = tmp; return (obj); }
对应的主函数需要每次接收返回的新头指针才能正常工作:
int main(void) { MyLinkedList *head; head = create(); head = myLinkedListAddAtHead(head, 10); head = myLinkedListAddAtHead(head, 9); head = myLinkedListAddAtHead(head, 8); return (0); }
但这个方案依然不满足题目要求:题目明确要求头插函数的返回值是void,不允许靠返回值传递新的头节点。
核心疑问
已知测试侧的主函数只会按照以下逻辑创建链表实例,之后直接调用头插接口,不会做传指针地址、接收函数返回值这类操作:
int main(void) { MyLinkedList *head; head = create(); return (0); }
要怎么在严格遵守题目给定的void myLinkedListAddAtHead(MyLinkedList* obj, int val)函数原型的前提下,完成链表头部新增节点的功能?
内容的提问来源于stack exchange,提问作者Snow_Ball
相关产品推荐
相关产品推荐

