删除链表中倒数第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即为待删除的结点
实在想不到哪里出了问题。各位帮忙看看

我想要达到的结果

正确结果


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),这样才对

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633