You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中按节点int值对链表升序排序的问题排查

链表升序排序卡顿问题分析与修复

你遇到的卡顿问题,根源在于最初把第二个循环里的next = next->next;写在了if条件块内部:当curr->val <= next->val时,next指针完全不会移动,第二个while循环的终止条件next != NULL永远无法满足,直接导致死循环,程序因此卡顿。

你借鉴数组冒泡排序的思路来实现链表排序本身是可行的——通过两层循环遍历节点,两两比较值并交换,最终实现升序排列。只要把指针移动的语句放到if块外部,保证无论是否发生值交换,next指针都能持续向后遍历,就能解决问题。

修正后的完整代码

#include <stdio.h>

struct node {
    int val;
    struct node* next;
};

// 补充swap函数实现(如果你的代码里未定义)
void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

void sort(struct node** head) {
    // 边界判断:空链表或只有一个节点时直接返回,避免无效遍历
    if (*head == NULL || (*head)->next == NULL) {
        return;
    }

    struct node* curr = *head;

    while (curr != NULL) {
        struct node* next = curr->next;
        while (next != NULL) {
            if(curr->val > next->val) {
                swap(&curr->val, &next->val);
            }
            // 无论是否交换,都必须移动next指针推进循环
            next = next->next;
        }
        curr = curr->next;
    }    
}

额外优化说明

  • 新增的边界判断可以跳过对空链表、单节点链表的无效遍历,小幅提升效率。
  • 当前实现通过交换节点的val值完成排序,对于int这类简单类型非常高效;如果后续需要处理复杂结构体,也可以改为调整节点指针的指向(交换节点本身),避免大结构体拷贝的开销。

内容的提问来源于stack exchange,提问作者sansarc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:40:28