【发布时间】:2015-06-18 10:50:43
【问题描述】:
假设我们有一个列表 1-2-3-4-5(列表的值可以没有顺序,例如 2-4-5-3-1);
任务是以如下方式重新排序列表节点(不是值):
1-5-2-4-3.
我编写了使用 2 个临时变量和 1 个指针的函数。但问题是我不知道如何将倒数第二个节点中的“下一个”指针设置为“NULL”,而无需在函数中定义第二个临时指针。
有没有更有效的方法来做到这一点?
void Swap(Node* begin)
{
if (begin->next != NULL || begin->next->next != NULL)
{
Node temp1 = *begin; //this variable is used for iteration
Node* temp2 = begin; //pointer to the target node
Node prev; //get the adress of last node
while (temp1.next != NULL)
{
prev = temp1;
temp1 = *temp1.next;
}
prev.next->next = temp2->next;
temp2->next = prev.next;
Swap(prev.next->next);
}
}
【问题讨论】:
-
你到底想做什么? “1-5-2-4-3”这个顺序代表什么模式?
-
表示节点的顺序。最后一个节点应该在第一个节点之后,第二个节点之后的倒数第二个节点,等等
-
所以,
Swap是一个递归函数。 -
获取指定顺序通常和排序一样。要对链表进行排序,您可以使用归并排序。这假设您有某种方法可以确定两个节点是否有序。
-
但实际上除了从列表的一侧到另一侧之外,没有办法确定它。这正是我所做的。在对 2 个元素进行排序后,函数递归地对较小的列表进行排序。
标签: c algorithm data-structures linked-list