[英]insertion sort linked list c++
我正在尝试编写一个代码来对包含整数的链接列表进行排序,但是根据我的推理,我认为它不会起作用我用铅笔和纸做出来的。 它不是遍历列表,而是比较第一对值,删除列表中的第二个值并返回列表的其余部分。 我的方法代码是:
//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
我对指针感到不舒服。 任何帮助表示赞赏!
如果不使用指针,那么这种任务的效果会更好,您可以使用指向指针的指针。 如果新元素单独传递,而不是在列表的开头“预先插入”,它也会更好。
但是,让我们继续你所拥有的,并将新节点预先插入列表的开头,并且你想将它移动到正确的位置。
然后,它会是这样的:
#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
语句毛球都完全消失了。 这就是所有混乱的来源。
另外,正如我最初提到的那样,如果新节点没有在列表的开头预先插入,并且作为单独的指针传递,那么这将变得更容易理解。 但是,这是你的出发点,所以......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.