使用双指针方法查找链表中的中间元素



我编写了以下函数,它返回链表的中间元素,使用双指针方法

struct node
{
int data;
struct node *next;
}*start;
void middleelement()
{
struct node *x=start,*y=start;
int n=0;
if(start==NULL)
{
    printf("nThere are no elments in the list");
}
else
{
    while((x->next)!=NULL)
    {
        x=x->next->next;
        y=y->next;
        n++;
    }
    printf("nMiddle element is %d",y->data);
}
}

但是,每当我运行这些函数时,Windows资源管理器就会停止工作代码中的缺陷是什么?有比这更好的算法来找到中间元素吗?

如果条目数为奇数,则x最终将为NULL,因此当下一个循环迭代引用它时,程序将崩溃。你应该修改你的条件来说明这一点:

while(x && x->next) {
    ...
}

在C中,与NULL进行比较是可选的,因此您可以跳过!= NULL来缩短条件。

当然,至少可以说,通过全局变量传递start参数是非正统的。最好将它作为一个正则函数参数传递。

最新更新