插入排序链表c ++

时间:2016-05-01 03:43:31

标签: c++ linked-list singly-linked-list insertion-sort

我正在尝试编写一个代码来对包含整数的链接列表进行排序,但是根据我的理由,我用铅笔和纸来解决这个问题。它不是遍历列表,而是比较第一对值,删除列表中的第二个值并返回列表的其余部分。 我的方法代码是:

//typedef Node * ListType;

void insertionSort(ListType &list) {
    ListType p = list;
    Node * curr;
    if(p == NULL || p->next == NULL){
        return;
    }
    while(p != NULL){
        curr = p->next;
        if(curr == NULL){
            break;
        }
        if(p->data > curr->data){
            p->next = curr->next;
            curr->next = p;
        }
        p = p->next;
    }
}

比如说,我从列表开始:5 2 3 4 在此列表上调用此方法后得到的输出是:5 3 4

我对指针感到不舒服。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:2)

如果不使用指针,这种任务的效果会更好,您可以使用指向指针的指针。如果新元素单独传递,而不是在列表的开头“预先插入”,它也会更好。

但是,让我们继续你所拥有的,并在列表的开头预先插入新节点,并且你想将它移动到正确的位置。

然后,它会是这样的:

#include <iostream>

class Node {

public:

    Node *next;

    int data;
};

typedef Node * ListType;

void insertionSort(ListType &list) {
    ListType *p = &list;

    while ( (*p)->next && (*p)->next->data < (*p)->data)
    {
        ListType node= *p;

        *p=node->next;

        node->next=node->next->next;

        (*p)->next=node;

        p= &(*p)->next;
    }
}

int main()
{
    Node *head=0;

    int n;

    while (std::cout << ">>> ", std::cin >> n)
    {
        Node *p=new Node;

        p->data=n;

        p->next=head;
        head=p;

        insertionSort(head);

        for (p=head; p; p=p->next)
            std::cout << p->data << " ";
        std::cout << std::endl;
    }
}

示例结果:

$ ./t
>>> 5
5 
>>> 7
5 7 
>>> 1
1 5 7 
>>> 3
1 3 5 7 
>>> 9
1 3 5 7 9 
>>> 6
1 3 5 6 7 9 
>>> 0
0 1 3 5 6 7 9 

这里的技巧是p是指向要插入的节点的指针,而不是p是指向要插入的节点的指针。*p是指向要插入的节点的指针。因此,如果您需要将新节点“推”到列表的下方,则“上一个”指针为if,您现在可以轻松更新。

尽管起初看起来很混乱,但跟踪“前一个”节点(其下一个指针需要更新)的情况要小得多。所有my_awesome_validation语句毛球都完全消失了。这就是所有混乱的来源。

另外,正如我最初提到的那样,如果新节点在列表的开头预先插入,并作为单独的指针传递,那么这将变得更容易理解。但是,这是你的出发点,所以......