我试图找到链接列表的中间元素,但是我得到了一个分段错误,我不知道哪里出了问题。这是我实现的兔兔算法:
//fast slow pointer method
void ptMiddle(struct node **head_ref)
{
struct node *fast = (*head_ref);
struct node *slow = (*head_ref);
fast = fast->next;
while(fast!=NULL)
{
// printf("%d%d",slow->data,fast->data);
slow = slow->next;
fast = fast->next->next;
}
printf("Middle elemnet is:%d\n",slow->data);
}
int main()
{
struct node * head=NULL;
push(&head,1);
push(&head,2);
push(&head,3);
push(&head,4);
printList(&head);
printf("M:%d\n",middleNode(&head)->data);
printf("here");
append(&head,5);
append(&head,6);
printList(&head);
printf("M:%d\n",middleNode(&head)->data);
printf("here");
ptMiddle(&head);
return 0;
}请帮帮忙。
发布于 2017-05-24 18:35:52
你的问题就在眼前:
fast = fast->next->next;假设链接列表中有两个元素:A -> B -> NULL,首先执行fast = fast->next,这将导致快速指向B节点。
当您进入while循环时,您尝试获取B->next->next,这将导致NULL->next,这显然是不存在的。
实现是完全错误的,您应该确保避免这种情况。时间可以更改为:
while(fast!=NULL && fast->next != NULL)这样就能解决问题。
请记住,在一对元素的情况下,您将始终得到中间的元素,而中间的元素则更多。所以在A -> B -> NULL中你可以得到节点A。
https://stackoverflow.com/questions/44166072
复制相似问题