中易网

一单链表中元素无序,编写算法将之排成有序序列

答案:3  悬赏:70  
解决时间 2021-11-25 22:01
单链表的排序
【基本要求】:
(1)一单链表中元素无序,编写算法将之排成有序序列;
(2)要求只在原有链表上操作,不单独分配空间。
使用标准C++
最佳答案
由冒泡排序得到启示,每趟均从头节点开始扫描,比较相邻两节点的数据,
满足特定要求时进行节点交换。
    需要注意的是,必须有一个指针保存当前节点的前一个位置,这样在交换
节点后链表不会断开;并且要指定一个哨兵节点作为每趟比较的终结点,该哨
兵节点实际上就是有序区的首节点。

struct Node {
    int data;
    Node *next;
};


void listSort(Node **head)
{
    if(head == NULL || *head == NULL)
        return;

    Node *cur, *post, *pre, *sentinel = NULL;  // sentinel 标记有序区的首个节点
    bool sorted;

    do {
        pre = NULL;
        cur = *head;
        sorted = true;

        
        while((post = cur->next) != sentinel) { 
            if(cur->data > post->data) { 
                sorted = false;  // 发生交换,则仍未有序
                cur->next = post->next;
                post->next = cur;

                if(pre != NULL)
                    pre->next = post;
                pre = post;

                if(cur == *head)
                    *head = post;  // 保证头指针指向最小的节点
            } else {
                pre = cur;
                cur = post;
            }
        }
        sentinel = cur;  // cur 为该趟排好序的节点
    } while(!sorted);    // 若未发生交换,则已经有序
}
全部回答
你好! 哥,这是最最基础的链表操作,看看冒泡排序,自己在编译器里练练吧,别来这找Copy代码 如有疑问,请追问。
std::sort(list.begin(), list.end());
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
侑食的意思是什么啊?请解释下!
呼伦贝尔市国家森林公园派出所地址在什么地方
招行车贷分期初审通过,后期还需要工作证明吗
牙克石森林公安局第一派出所地址在什么地方,
手机插sim卡没用是手机的问题修一下要多少钱
光电计数器的意思是什么啊?请解释下!
越秀金控it部门如何?技术水平和员工发展好不
如何理性看待中日关系
黛莱美眼唇精华液怎么用
满洲里市公安局互贸派出所地址有知道的么?有
行吟诗人的意思是什么啊?请解释下!
我租了一个情人怎么样
请问这是被害妄想症吗?
学生电脑的密码忘了怎么办
常州市新北区城市管理与建设局怎么去啊,有事
推荐资讯
方目的意思是什么啊?请解释下!
小孩满月照退后了几天好吗
花呗3500额度,能分期付款买两个都是2000的东
纸上种黄豆芽苗菜烂了是咋回事
石家庄月薪4000无保险,月薪2500五险一金你选
新沂市草桥派出所办公地址在什么地方,我要处
光大银行梅江支行办公地址在什么地方,我要处
minecraft(我的世界)1如何将动力煤矿车和普
郭家街道办事处农村集体资产资源招投标中心办
考大学考体院需要要求身高嘛?
金三角网络会所地址在哪,我要去那里办事
房贷提前还,需要交违约金,或者一个月的利息
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?