交换两个节点

时间:2016-12-03 08:57:11

标签: c

我想交换链表的两个节点,不管我不想交换数据,我想更改链接。

这是我到目前为止所做的事情。

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指针和当前的

1 个答案:

答案 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

在更改nextprev_p的{​​{1}}字段之前,您首先必须检查它是否分别为prev_q或{{1} } 否则你最终会遇到上述尴尬局面。所以你的功能的第二部分应该是这样的:

q

编辑如果p或q可以是列表的头部,则它们将没有父级。 pif (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:如果您要交换数据而不是交换链接,则不会出现此问题。正如你所说(在你的描述中)你不想交换数据,我会让你考虑是否必须改变策略。