链表排序问题。先输入原始链表的节点编号顺序,按Crl+z组合键或输入非数字表示输入结束,然后编程输出链表按节点值升序怕排列后的结点顺序。使用c语言编程
时间: 2024-10-19 14:14:12 浏览: 25
c语言-c语言编程基础之leetcode题解第24题两两交换链表中的节点.zip
链表排序问题是将一个未排序的单向链表转换成按照节点值升序排列。这里假设链表节点包含一个整数值和指向下一个节点的指针。你可以通过遍历整个链表并比较每个节点的值来进行排序。以下是基本步骤:
1. 创建一个辅助函数 `compare_nodes`,用于比较两个节点的值,如果第一个节点小于第二个,则返回负数;等于则返回0;大于则返回正数。
2. 定义一个函数 `insertion_sort_list`,采用插入排序算法对链表进行排序。从头开始遍历链表,对于每个节点,依次与后面的节点进行比较,如果当前节点值小于后一个节点,就交换它们的位置。
```c
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
ListNode* insertion_sort_list(ListNode* head) {
if (head == NULL || head->next == NULL) return head; // 如果链表为空或只有一个元素,无需排序
ListNode *dummy = (ListNode*)malloc(sizeof(ListNode)); // 创建虚拟头节点
dummy->val = INT_MIN; // 设置虚拟头的值为最小值
dummy->next = head;
ListNode *prev = dummy, *current = head;
while (current != NULL && current->next != NULL) {
if (current->val > current->next->val) { // 比较相邻节点,如果前小后大,交换位置
ListNode temp = *current;
*current = *current->next;
*current->next = temp;
prev = current;
current = current->next;
} else {
prev = current;
current = current->next;
}
}
return dummy->next; // 返回经过排序的新头节点
}
// 用户输入部分省略,这部分需要用户输入链表节点值,并通过Crl+z确认输入结束
```
阅读全文