Blue_Zx 2024-12-14 09:10 采纳率: 68.2%
浏览 10
已结题

删除链表中的特定节点

力扣题,删除链表中的特定节点,请问这样写有什么问题吗?

img


```c
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* deleteNode(struct ListNode* head, int val) {
    struct ListNode*p,*p0,*q;
    p=p0=head;
   if(p->val==val)
   {
    head=head->next;
    return head;
   }  
   else
   {
    p=p->next;
   }
   while(p!=NULL)
   {
    if(p->val==val)
    {
        q=p;
        p=p->next;
        p0->next=p;
        free(q);
    }
    else
    {
        p0=p;
        p=p->next;
    }
   }
    return head;
}

```

  • 写回答

2条回答 默认 最新

  • JavaPub-rodert 领域专家: 后端开发技术领域 2024-12-14 16:05
    关注

    本答案参考多次询问ChatGPT-3.5后选择的最佳回答,若是满意,还请采纳,谢谢。

    您的代码中存在几个问题:

    1. 内存泄漏:当头节点需要被删除时,您正确地将head指向下一个节点,但是没有释放原头节点的内存。

    2. 边界条件处理:当链表中最后一个节点需要被删除时,您的代码没有正确处理这种情况。

    3. 节点删除逻辑:在删除节点后,您没有正确地维护p0p的指针关系,这可能会导致链表断裂。

    以下是修改后的代码示例:

    struct ListNode* deleteNode(struct ListNode* head, int val) {
        // 如果头节点就是要删除的节点
        if (head == NULL) return NULL;
        if (head->val == val) {
            struct ListNode* toDelete = head;
            head = head->next;
            free(toDelete);
            return head;
        }
    
        struct ListNode* cur = head;
        while (cur->next != NULL) {
            if (cur->next->val == val) {
                struct ListNode* toDelete = cur->next;
                cur->next = cur->next->next;
                free(toDelete);
            } else {
                cur = cur->next;
            }
        }
        return head;
    }
    

    这段代码首先检查头节点是否是要删除的节点,如果是,则释放该节点并返回新的头节点。然后,它遍历链表,检查每个节点的下一个节点是否是要删除的节点,如果是,则删除该节点并释放内存。这样可以确保即使链表中最后一个节点是要删除的节点,也能正确处理。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月22日
  • 已采纳回答 12月14日
  • 创建了问题 12月14日