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
相关产品推荐
相关产品推荐

