链表的具体排序

时间:2014-01-27 20:25:10

标签: c sorting linked-list

我必须以特定的方式对我的链表进行排序,例如我有这样的链表:3-> 1-> 4-> 1-> 7-> 5-> 7它必须是如此分类:7-> 1-> 7-> 1-> 3-> 4-> 5。所以从我的理解,我必须找到例如列表中的最大元素并在开头添加它并从当前列表中删除这样的元素,我很好奇,如果有任何方法,例如交换元素在列表中间的位置开始列表。或者我必须删除这样的元素并使用给定的数据分配内存并在开头添加它?总的来说,它是编程类测试的任务,必须使用单链表完成。

2 个答案:

答案 0 :(得分:0)

以下是一种方法:给出未排序的列表P

  1. 创建列表Q
  2. max(P)附加到Q
  3. max(P)移除P
  4. min(P)附加到Q
  5. min(P)移除P
  6. 再一次重复步骤2到5。
  7. 按升序排序P
  8. P附加到Q
  9. Q现在是您的已排序列表。

    这种方法假设P的长度不小于4。

答案 1 :(得分:0)

如果有指向列表节点指针的指针,即head指针和节点'next指针,则可以在单链表中交换节点。你可以这样做,因为你必须走到列表中才能找到最大值。 (注意选择最后一个最大值,否则对此函数的subseqnet调用会将相同的7带到前面。)

void max_to_front(struct node **head)
{
    struct node **mp = head;    // current max pointer address
    struct node **pv = head;    // iterator pointer address
    struct node *nd = *head;    // iterator pointer
    int mx;

    // nothing to do for empty or single-node lists
    if (*head == NULL || (*head)->next == NULL) return;

    // find maximum
    mx = nd->value;
    while (nd) {
        if (nd->value >= mx) {
            mp = pv;
            mx = nd->value;
        }
        pv = &nd->next;
        nd = nd->next;
    }

    // move max to the front, i.e.  update the pointers
    nd = *mp;
    *mp = (*mp)->next;
    nd->next = *head;
    *head = nd;
}

注意pv如何始终包含您通过其到达当前节点nd的节点指针的地址,以便您可以更新它; mp只是具有最大值的节点的指针地址。