尝试反向链接列表时显示分段错误

时间:2019-06-01 10:25:31

标签: c++ reverse singly-linked-list

我尝试使用此代码反转单个链接列表的一部分,但是此代码给我分段错误

如果在while循环条件下用NULL替换endOfSec-> next(在调用站点上将end-> next设置为NULL之后),则效果很好!

void reverseList(ListNode* startOfSec, ListNode *endOfSec){

    ListNode *prev = NULL;
    ListNode *curr = startOfSec;
    ListNode *nxt;
    while(curr!=endOfSec->next){
        nxt = curr->next;
        curr->next = prev;
        prev = curr;
        curr = nxt;
    }
}

Callsite:
//code to get start and end pointers
reverseList(start, end);

我希望我的代码不需要设置end-> next指针为NULL即可反转列表的部分。

1 个答案:

答案 0 :(得分:1)

此代码存在两个问题,其中一些问题比其他问题更容易解决。对于此特定的分段错误,代码演练将揭示原因。让我们来看一个简单的例子。 (您应该手动或使用调试器来学习如何自行执行此操作。)

start -> end -> NULL

这是一个包含两个元素的列表,一个名为“开始”,另一个名为“结束”。恩,让我们说“开始”和“结束”也是指向节点的指针。这有点模棱两可,但是这次不应该引起问题。现在反转列表。

reverseList(start, end);

reverseList中循环的第一次迭代之前(即在初始化之后),您的数据如下所示。

startOfSec == start
endOfSec == end;     endOfSec->next == NULL;
prev == NULL
curr == start
nxt == /* uninitialized */

start -> end -> NULL

第一次迭代后,数据已更新。

startOfSec == start
endOfSec == end;     endOfSec->next == NULL;
prev == start
curr == end
nxt == end

start -> NULL
end -> NULL

第二次迭代后,数据已更新。

startOfSec == start
endOfSec == end;     endOfSec->next == start;
prev == end
curr == NULL
nxt == NULL

end -> start -> NULL

恭喜,该列表已被颠倒。现在我们要做的就是退出循环,所以我们希望curr等于endOfSec->next。但是,NULL不等于start,因此我们继续进行第三次迭代,并在尝试读取curr->next(又称NULL->next)时崩溃。

总体而言,您需要修改跟踪该部分的开头和结尾的方式以进行反转。当前崩溃的发生是因为您无法跟踪本节的结尾。 (也许改为检查prev != endOfSec?)如果该节的末尾不是列表的末尾,您也会遇到问题(反转部分之后的列表部分将陷入混乱),但这就是易于更改prev的初始化方式。我看到的最大问题是,该部分的开头不是列表的开头–更改单链接列表需要在更改之前修改节点(也就是{{1}之前的节点) }。