在不更改节点链接的情况下反转链接列表

时间:2016-08-27 21:22:18

标签: c linked-list

我尝试了这段代码,但是我遇到了分段错误。我该如何解决这个错误?

void rev()
{
    struct node *p,*q;
    p=start;
    q=start;

    int count=0,temp,i,j;

    while(p!=0)
    {
        p=p->next;
        count++;
    }
    for(i=0; i<(count/2); i++)
    {
        p=start;
        for(j=0; j<(count-i); j++)
            p=p->next;

        temp=q->data;
        q->data=p->data;
        p->data=temp;

        q=q->next;
    }
 }

此处pq是指针。起初,两者都指向开始。 然后,通过使用两个循环,我交换了第一个和最后一个节点的值,然后是第二个和第二个节点,依此类推。

2 个答案:

答案 0 :(得分:1)

您有一个错误的错误。您计算列表中的count个元素,然后在for列表的i列表的第一次迭代中,您在列表中逐步pcount - 0个链接。这使它成为NULL,因为你刚刚完成了确定。然后,当您评估p->data时,会产生未定义的行为。

从1到i而不是从count / 20运行count / 2 - 1

答案 1 :(得分:1)

将你的for(i=0; i<(count/2); i++)放在纸上。

当您到达链表中的最后一个节点时,q和p都指向最后一个节点;

p = p -> next //is NULL so p goes NULL;

你的循环正在运行一次迭代。 所以将内部循环更新为count -i - 1

当您指定p -> data = temp //哪个NULL - &gt; data = temp,毫无意义

程序崩溃并发出分段错误。