单调递增输出乱序带头单链表,不借助其他辅助数组,C语言
时间: 2024-09-07 15:04:35 浏览: 35
动态规划问题-最长单调递增子序列问题
在C语言中,对一个带头结点的单链表进行单调递增输出,不使用其他辅助数组,可以通过就地调整链表中的节点顺序来实现。以下是一个基本的算法步骤:
1. 初始化两个指针,一个指向头结点的下一个节点(即第一个数据节点),另一个为空。
2. 遍历链表,对于当前节点,比较其值与前驱节点的值:
- 如果当前节点的值大于等于前驱节点的值,则不调整,直接将前驱节点移动到当前节点,继续向前遍历。
- 如果当前节点的值小于前驱节点的值,则需要将当前节点从链表中拆下,并插入到前驱节点的后面,保证链表的单调递增性。
3. 重复步骤2,直到遍历完整个链表。
具体的C语言实现代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义单链表的节点结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 创建新节点的函数
ListNode* createNode(int val) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
if (newNode) {
newNode->val = val;
newNode->next = NULL;
}
return newNode;
}
// 插入节点到链表的函数
void insertNode(ListNode* head, int val) {
ListNode* newNode = createNode(val);
if (newNode) {
ListNode* cur = head;
while (cur->next) {
cur = cur->next;
}
cur->next = newNode;
}
}
// 单调递增输出链表的函数
void printSortedList(ListNode* head) {
ListNode *cur = head->next, *prev = head, *temp;
while (cur) {
if (prev->val > cur->val) {
// 将当前节点cur从链表中断开
temp = cur->next;
// 插入到prev节点后面
cur->next = prev->next;
prev->next = cur;
// 更新当前节点
cur = temp;
// 如果插入导致前驱节点改变,则更新prev
if (prev->next) {
prev = prev->next;
}
} else {
prev = cur;
cur = cur->next;
}
}
// 正常输出单调递增的链表
cur = head->next;
while (cur) {
printf("%d ", cur->val);
cur = cur->next;
}
printf("\n");
}
int main() {
ListNode* head = createNode(0); // 创建带头结点的链表
insertNode(head, 3);
insertNode(head, 1);
insertNode(head, 2);
insertNode(head, 5);
insertNode(head, 4);
printf("链表原始输出: ");
printSortedList(head); // 输出单调递增的链表
return 0;
}
```
注意:上面的代码中创建链表的节点是使用了简单的手动分配内存的方式,实际使用中可能需要考虑内存释放的问题。
阅读全文