首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单链表C++的插入排序

单链表C++的插入排序
EN

Stack Overflow用户
提问于 2020-03-01 06:16:21
回答 1查看 238关注 0票数 0

我得到了一个头文件,它定义了如何创建链表的节点

代码语言:javascript
复制
#ifndef _LISTNODE
#include <cstddef>
#define _LISTNODE

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
#endif

我的任务是创建一个函数,它将对链表进行插入排序,并按降序对项进行排序(可以假设链表中没有循环。

该函数的定义如下

代码语言:javascript
复制
ListNode *insertionSortList(ListNode *head)

因此,我当前的逻辑是遍历链表,直到我发现迭代器当前所在的节点小于它旁边的节点的值。在这种情况下,它将获取包含较大数字的节点的值,并将其存储在临时指针中。然后,我的迭代器,它位于刚刚被放入temp指针的节点之前的数字上,使得这个节点现在指向打破顺序的节点,并指向之后的节点。

然后,我让另一个迭代器遍历列表,直到找到它应该去的位置以使顺序工作,然后将正在存储的节点与temp指针放在一起,并使此节点中的下一个指针指向新迭代器发现小于它的节点。

如果这个解释有点混乱,我很抱歉,但是当我绘制一个图表时,它似乎是有意义的,我看不出我的代码可能会破坏这个逻辑,但是当我用一些测试用例运行它时,它要么不排序,要么有时不排序,不打印所有的值。

代码语言:javascript
复制
#include <iostream>
#include "ListNode.h"
using namespace std;

ListNode *insertionSortList(ListNode *head)
{
    ListNode *temp;
    for (ListNode *iterator = head; iterator->next != NULL; iterator = iterator->next) //first iterator to find node that breaks the pattern
    {
        if (iterator->val >= iterator->next->val) // if it doesn't break the pattern
        {
            break;
        }

        else //if it does break the pattern
        {
            temp = iterator->next; //store pattern breaking node
            iterator->next = iterator->next->next; //have linked list skip over this pattern breaking node 
            for (ListNode *replacementit = head; replacementit->next != NULL; replacementit = replacementit->next) // find place for patteern breaking node
            {
                if (replacementit->val < temp->val) //if found the right place
                {
                    temp->next = replacementit; //put node into place
                    break;
                }
            }
        }
    }

    return head;
}

int main() //test cases
{
    ListNode A(5);
    ListNode B(6);
    ListNode C(10);
    ListNode D(21);
    ListNode E(25);

    ListNode* head = &A;
    A.next = &B;
    B.next = &C;
    C.next = &D;
    D.next = &E;

    insertionSortList(head);

    for (ListNode *print = head; print->next != NULL; print = print->next) //print out sorted Linked List
    {
        cout << print->val << " ";
    }
}

输出

代码语言:javascript
复制
5 10 % 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-01 17:38:43

您在insertionSortList函数的第一个for循环内的第一行中的实现不正确。

例如,如果链表的第一个元素大于或等于链表的第二个元素,您的代码将不会在For循环中执行更多的行,它将“中断”。您可以使用list 2 -> 1 -> 3进行检查。

而且,最后当你打印链表时,它总是不会打印最后一个元素,因为终止条件是错误的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60470092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档