小向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日
  • 展开全部

悬赏问题

  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂