删除链表中倒数第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;
}
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