我正在尝试通过节点struct(age)中的int值重新排序我的DLL。当我直接访问int时,它可以正常工作,但我正在尝试交换整个节点,以便在重新排序列表时我不必交换struct中的每个变量。
void DLL::ReOrg(node* head, int DLL_Size)
{
node* temp = head;
int holder;
for(int j = 0; j < DLL_Size; j++)
{
while(temp != NULL)
{
if (temp->next != NULL && (temp->age < temp->next->age) )
{
holder = temp->age;
temp->age = temp->next->age;
temp->next->age = holder;
}
else
temp = temp->next;//increment node
}
temp = head;
}
}
这有效,但当我尝试做类似的事情时:
node* holder;
...
holder = temp;
temp = temp->next;
temp->next = holder;
我的程序将编译并运行一个空白屏幕。任何指导将不胜感激。我猜测交换所有变量会更容易(没有很多),但我想让我的代码更清晰。感谢。
答案 0 :(得分:0)
这是因为你实际上没有重新链接节点,所以你得到一个无限循环。您需要更改上一个节点的next
链接以及下一个节点上的prev
链接。
如果您的列表是双向链接的,并且您有一个前一个指针和一个下一个指针,那么您可以执行以下操作:
node* next = temp->next;
// Fix the links of the previous node, and the next-next node
if (temp->prev)
temp->prev->next = next;
if (next->next)
next->next->prev = temp;
// Relink the two nodes that should be swapped
temp->next = next->next;
next->next = temp;
next->prev = temp->prev;
temp->prev = next;