假设我们有一个列表1-2-3-4-5(列表的值可以没有顺序,例如2-4-5-3-1);
任务是以这样的方式重新排序列表的节点(而不是值):
1-5-2-4-3。
我编写了使用2个临时变量和1个指针的函数。但问题是我不知道如何设置" next"倒数第二个节点中的指针指向" 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);
}
}
答案 0 :(得分:1)
您可以使用此算法:o(n)时间复杂度
请记住将最后一个节点的下一个指针更改为NULL。
(如果奇数,你必须遍历一个元素,即使堆栈为空)
答案 1 :(得分:0)
所以基本上你想要做的是:
N0, N1, ..., Nm -> N0, Nm, N1, Nm-1, ..., Nm/2 if m is even
-> N0, Nm, N1, Nm-1, ..., N(m-1/2), N(m+1/2)
你可以从i in (m/2 +1)..m
(反向)走你的列表(假设m是偶数)删除节点并将其插入i+1
或从i in (m/2 +1)..m
开始列表(假设m为偶数)删除节点并将其插入m-i+1
第