您的代码将仅对于这种类型的链的工作:
... -> prev_p -> p -> ... -> prev_q -> q ->...
或
... -> prev_q -> q -> ... -> prev_p -> p ->...
但如果你有这些情况将不工作:
... -> prev_p -> p -> q -> ....
或
... -> prev_q -> q -> p ->...
使用你的代码,你会得到一个循环结束了在这两个你链表中情况(第一种为... prev_p -> q -> q
,第二种情况为... prev_q -> q -> q
)。
之前改变prev_p
的next
字段或prev_q
你首先要检查它是否分别不q
或p
否则你将与上述难堪的局面结束了。所以,你对你的函数的第二部分,应该是这样的:
if (prev_q == p){
q->next = p;
else{
if(prev_q){
prev_q->next = p;
}else{
// q has no parent -> q was the head -> p must become new head
}
}
if (prev_p == q){
p->next = q;
else{
if(prev_p){
prev_p->next = q;
}else{
// p has no parent -> p was the head -> q must become new head
}
}
编辑如果P或Q可以在列表的头部,他们将没有父。 prev_q
或prev_p
然后将为空(请参阅您的pastebin)
PS:如果您将交换数据而不是交换链接,则不会发生此问题。正如你所说(在你的描述中)你不想交换数据,我会让你考虑是否需要改变战术。
“不知道我的逻辑是否有效” - 检查。 – MayurK
*“问题是我不知道我的逻辑是否正常工作”*因此编写一个测试用例,在调试器中对其进行编码,看看它是否有效。 –
好吧,到目前为止测试没有工作,即时通讯发现问题跟踪在我的排序功能最小和当前的节点 –