更改单链接列表中的节点顺序

时间:2015-06-18 10:50:43

标签: c algorithm data-structures linked-list

假设我们有一个列表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);
    }

}

2 个答案:

答案 0 :(得分:1)

您可以使用此算法:o(n)时间复杂度

  1. 计算列表中的节点数(n)。
  2. 将最后n / 2个节点放在堆栈中。
  3. 从头开始遍历列表。
  4. 对于每个遍历的元素,从堆栈中弹出元素并使其成为遍历元素的下一个元素。
  5. 直到堆栈变空为止。
  6. 请记住将最后一个节点的下一个指针更改为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

位置