C++ 尝试反转链接列表时显示分段错误

C++ 尝试反转链接列表时显示分段错误,c++,reverse,singly-linked-list,C++,Reverse,Singly Linked List,我尝试使用此代码反转单链表的一部分 这里startOfSec是指向要反转的链表节的起始节点的指针,endofSec是指向该节最后一个节点的指针 现在,有了这段代码,我得到了分段错误,但是如果我在while循环条件下将endOfSec->next替换为NULL(我将指针的值更改为NULL,指向原始链表部分(要反转)的最后一个节点),它就可以完美地工作 void reverseList(ListNode* startOfSec, ListNode *endOfSec){ ListNode

我尝试使用此代码反转单链表的一部分

这里startOfSec是指向要反转的链表节的起始节点的指针,endofSec是指向该节最后一个节点的指针

现在,有了这段代码,我得到了分段错误,但是如果我在while循环条件下将endOfSec->next替换为NULL(我将指针的值更改为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。

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

这是一个包含两个元素的列表,一个名为“开始”,另一个名为“结束”。嗯,假设“开始”和“结束”也是指向节点的指针。这有点模棱两可,但这次不应该引起问题。现在把清单倒过来

reverseList(start, end);
反向列表中循环的第一次迭代之前(即初始化之后),您的数据如下所示

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
在第二次迭代之后,数据已经更新

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
的初始化方式,这很容易解决。我看到的最大问题是当节的开头不是列表的开头时–更改单链接列表需要在更改之前对节点进行修改(即
startOfSec
之前的节点)。

什么是
endOfSec
?它指向哪里?你能试着创建一个显示给我们看吗?@Someprogrammerdude
endOfSec
指向列表部分的最后一个节点,我想反转它。例如,如果列表是
1->2->3->4->5->6->7->8
,而要反转的部分是
3->4->5->6
,则startOfSec指向3,endOfSec指向6感谢您在构建答案方面的帮助和努力!我意识到问这样的问题是很遗憾的,我应该在调试上付出更多的努力。下次我会记得的。为了回应您对节前后节点的关注,我想补充一点,调用站点之前的一部分代码保留了节前后节点的变量(需要反转),并在函数外部相应地更改了它们与节的连接。