通过对实际节点进行排序来排序链表,而不仅仅是通过交换节点值

时间:2016-03-12 01:19:21

标签: c sorting

我想对链表进行排序,以便按排序顺序排列节点。我已经查找了几个算法,但它们都交换数据值而不是实际节点本身。有谁知道我在哪里可以找到关于如何交换节点本身而不仅仅是值的代码?

3 个答案:

答案 0 :(得分:0)

参考: http://www.geeksforgeeks.org/merge-sort-for-linked-list/

它显示了如何使用合并排序对链接列表进行排序,以及通过更改指针进行排序。

答案 1 :(得分:0)

不是交换内容,而是更改指针/" next_item"变量指向新订单的正确节点。

答案 2 :(得分:0)

这是合并排序链表的传统和最快方式。它是一种自下而上的样式合并排序,它使用指向节点的指针数组来保存中间列表,其中array [i]为null或指向列表,其中2表示power i节点。原始列表中的节点合并到数组中,然后合并阵列中的列表以形成单个排序列表。 HP / Microsoft C ++ STL std :: list :: sort使用相同的算法。

/* prototype */
NODE * MergeLists(NODE *pSrc1, NODE *pSrc2);

/* sort list using array of pointers to first nodes of list   */
/* aList[i] = NULL or ptr to list with 2 to the power i nodes */

#define NUMLISTS 32                 /* size of array */
NODE * SortList(NODE *pList)
{
NODE * aList[NUMLISTS];             /* array of lists */
NODE * pNode;
NODE * pNext;
int i;
    if(pList == NULL)               /* check for empty list */
        return NULL;
    for(i = 0; i < NUMLISTS; i++)   /* zero array */
        aList[i] = NULL;
    pNode = pList;                  /* merge nodes into array */
    while(pNode != NULL){
        pNext = pNode->next;
        pNode->next = NULL;
        for(i = 0; (i < NUMLISTS) && (aList[i] != NULL); i++){
            pNode = MergeLists(aList[i], pNode);
            aList[i] = NULL;
        }
        if(i == NUMLISTS)           /* don't go past end of array */
            i--;
        aList[i] = pNode;
        pNode = pNext;
    }
    pNode = NULL;                   /* merge array into one list */
    for(i = 0; i < NUMLISTS; i++)
        pNode = MergeLists(aList[i], pNode);
    return pNode;
}

/* mergelists -  compare uses src2 < src1           */
/* instead of src1 <= src2 to be similar to C++ STL */

NODE * MergeLists(NODE *pSrc1, NODE *pSrc2)
{
NODE *pDst = NULL;                  /* destination head ptr */
NODE **ppDst = &pDst;               /* ptr to head or prev->next */
    if(pSrc1 == NULL)
        return pSrc2;
    if(pSrc2 == NULL)
        return pSrc1;
    while(1){
        if(pSrc2->data < pSrc1->data){  /* if src2 < src1 */
            *ppDst = pSrc2;
            pSrc2 = *(ppDst = &(pSrc2->next));
            if(pSrc2 == NULL){
                *ppDst = pSrc1;
                break;
            }
        } else {                        /* src1 <= src2 */
            *ppDst = pSrc1;
            pSrc1 = *(ppDst = &(pSrc1->next));
            if(pSrc1 == NULL){
                *ppDst = pSrc2;
                break;
            }
        }
    }
    return pDst;
}