我想交换链表的两个节点,不管我不想交换数据,我想更改链接。
这是我到目前为止所做的事情。
void swap(student * prev_p, student * p, student * prev_q, student *q)
{
student *tmp=NULL;
tmp=p->next;
p->next=q->next;
q->next=tmp;
tmp=prev_p->next;
prev_p->next=q;
prev_q->next=tmp;
}
然后我在泡泡/选择排序中调用此函数两个交换两个节点
问题是我不知道我的逻辑是否有效,在我的选择排序函数中的第二个我只有min指针和当前的
答案 0 :(得分:1)
您的代码仅适用于此类链:
... -> 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
。
在更改next
或prev_p
的{{1}}字段之前,您首先必须检查它是否分别为prev_q
或{{1} } 否则你最终会遇到上述尴尬局面。所以你的功能的第二部分应该是这样的:
q
编辑如果p或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
}
}
将为NULL(请参阅您的pastebin)
PS:如果您要交换数据而不是交换链接,则不会出现此问题。正如你所说(在你的描述中)你不想交换数据,我会让你考虑是否必须改变策略。