小向z 2022-11-23 15:27 采纳率: 100%
浏览 1
已结题

删除链表中倒数第N个结点,不知道哪里出问题了

问题遇到的现象和发生背景

删除链表中倒数第N个结点,帮忙看看思路哪里出问题了

用代码块功能插入代码,请勿粘贴截图
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
//dummy-1-2-3-4-5-6-null

struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
    struct ListNode *DummyNode=(struct ListNode*)malloc(sizeof(struct ListNode));
    DummyNode->next=head;
    struct ListNode* fast = DummyNode;
    struct ListNode* slow = DummyNode;
    for(int i=0;i<=n;i++)
    {
        fast=fast->next;
    }
    while(fast!=NULL)
    {
        fast=fast->next;
        slow=slow->next;
    }

    slow->next=slow->next->next;
    slow->next->next=NULL;//这句话加和不加都报错了
    free(slow->next);  
    return DummyNode->next;
}

运行结果及报错内容

img

我的解答思路和尝试过的方法

leecode的一个题,我的思路是快慢指针,先创建一个虚拟头节点DummyNode,DummyNode->next=head。
https://img-mid.csdnimg.cn/release/static/image/mid/ask/862891981966175.png "#left")
后fast和slow指针同时先指向DummyNode,fast指针先移动n+1个单位,然后slow和fast同时移动,直到fast为NULL时停止。
停止后slow->next即为待删除的结点
实在想不到哪里出了问题。各位帮忙看看

我想要达到的结果

正确结果

  • 写回答

3条回答 默认 最新

  • 於黾 2022-11-23 15:32
    关注
    
    slow->next=NULL;
        free(slow->next); 
    

    你能free一个NULL吗
    这只是其中一个问题
    现在再看你删除的逻辑
    假设有3个节点
    a=>b=>c
    你要把a指向c
    就是

    slow->next=slow->next->next;
    
    

    这一句
    问题是next就不要再变了,你把next重新变成NULL,那slow不变成尾节点了吗
    你需要另一个指针p,先让它指向next,当next改变成nextnext之后,再free(p),这样才对

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

报告相同问题?

问题事件

  • 系统已结题 12月1日
  • 已采纳回答 11月23日
  • 修改了问题 11月23日
  • 修改了问题 11月23日
  • 展开全部

悬赏问题

  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多