使用【c】写【已知非空单链表,请写一算法,将链表中数据域值最小的那个结点移到链表的最前面。要求:不得额外申请新的结点。】的代码
时间: 2024-09-19 14:18:06 浏览: 53
在C语言中,你可以使用迭代的方式来实现这个算法,因为不需要额外分配内存,我们可以在原地修改链表节点的位置。这里是一个简单的示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
// 将最小值节点移动到链表头部
void moveMinToHead(ListNode** head) {
if (*head == NULL || (*head)->next == NULL) {
// 如果链表为空或只有一个元素,直接返回
return;
}
ListNode* min_node = *head; // 初始化最小节点为头节点
ListNode* current = *head->next;
while (current != NULL) { // 遍历链表
if (current->val < min_node->val) {
min_node = current; // 更新最小值节点
}
current = current->next;
}
// 移动最小节点到头节点位置
if (min_node != *head) {
min_node->next = *head;
*head = min_node;
}
}
// 测试函数
void printList(ListNode* head) {
while (head != NULL) {
printf("%d -> ", head->val);
head = head->next;
}
printf("NULL\n");
}
int main() {
// 创建一个测试链表
ListNode* list = malloc(sizeof(ListNode));
list->val = 5;
list->next = malloc(sizeof(ListNode));
list->next->val = 3;
list->next->next = malloc(sizeof(ListNode));
list->next->next->val = 7;
list->next->next->next = malloc(sizeof(ListNode));
list->next->next->next->val = 2;
printf("Original List: ");
printList(list);
moveMinToHead(&list);
printf("Moved Min to Head: ");
printList(list);
free(list); // 释放内存
return 0;
}
```
这段代码首先创建了一个有四个元素的链表,然后通过`moveMinToHead`函数将最小值节点移到了链表的头部,并打印出结果。注意,在实际应用中,你需要确保链表节点已经被正确初始化并且不会发生越界。
阅读全文