赞
踩
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @return ListNode类 */ ListNode* ReverseList(ListNode* head) { // write code here if (head==NULL) { return nullptr; } ListNode* start=(ListNode*)malloc(sizeof(ListNode)); ListNode* end; end = head; int length = 0; start->next = nullptr; while (end != NULL) { // 正确分配新节点的内存,并设置其值和next指针 ListNode* temp = (ListNode*)malloc(sizeof(ListNode)); if (temp != NULL) { // 总是检查malloc是否成功 temp->val = end->val; temp->next = start; // 在开始处插入 start = temp; // 现在start指向新节点,使其成为列表的新头部 } else { // 处理内存分配失败 } // ListNode *temp; // temp->val=end->val; // temp->next=start; //start->val=end->next->val; //start->next=temp; end = end->next; } return start; }
您的函数目的是反转链表,但在实现中有一些需要注意和改进的地方:
您在循环中为每个节点重新分配内存,这实际上是在创建原始链表的深拷贝的反转版本,而不是就地反转链表。如果只需要反转链表而不创建其副本,则无需分配新的节点内存。
start指针被初始化为一个新分配的节点,这会导致在返回的链表开头有一个额外的未使用的节点。
没有释放原始链表的内存,如果意图是创建新的链表副本,则应该有相应的机制来管理旧链表的内存,以避免内存泄漏。
下面是一个更正和优化后的代码,直接就地反转链表,不创建新节点:
ListNode* ReverseList(ListNode* head) { if (head == NULL || head->next == NULL) { return head; } ListNode* prev = NULL; ListNode* curr = head; ListNode* next = NULL; while (curr != NULL) { next = curr->next; // 保存下一个节点 curr->next = prev; // 反转当前节点的指针 prev = curr; // 移动prev到当前节点 curr = next; // 移动curr到下一个节点 } return prev; // prev成为新的头节点 }
这段代码通过遍历原始链表,将每个节点的next指针指向它的前一个节点,从而实现了链表的就地反转。在遍历结束时,prev将指向原始链表的最后一个节点,它成为反转后的链表的头节点。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。