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

时间:2012-07-13 15:47:13

标签: c

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

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资源管理器都会停止工作 代码中的缺陷是什么? 有没有比这更好的算法来找到中间元素?

1 个答案:

答案 0 :(得分:2)

如果条目数是奇数,那么x将最终为NULL,因此当下一个循环迭代引用它时,您的程序将崩溃。您应该修改您的条件以解释:

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

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

当然,通过全局变量传递start参数是非正统的,至少可以这么说。将它作为常规函数参数传递会好得多。