将单链表中的最小节点移动到链表最前面,具体代码怎么写?,用c语言
时间: 2024-10-21 08:08:11 浏览: 27
将单链表中的最小元素移到链表的头部,可以使用两个指针,一个指向当前最小值,另一个遍历整个链表。以下是使用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));
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 找到链表中的最小值
ListNode* findMin(ListNode* head) {
if (head == NULL || head->next == NULL) {
return head; // 如果链表为空或只有一个元素,直接返回头
}
ListNode* minNode = head;
while (minNode->next != NULL) {
if (minNode->next->val < minNode->val) {
minNode = minNode->next; // 更新最小值节点
}
}
return minNode;
}
// 移动最小值到链表头部
void moveMinToFront(ListNode** head) {
ListNode* min = findMin(*head);
ListNode* current = *head;
// 如果最小值就是头节点,不需要操作
if (min == current) {
return;
}
// 否则,更新头节点指向最小值,并调整其他节点
*head = min;
while (current->next != min) {
current = current->next;
}
current->next = min->next;
min->next = *head;
}
// 遍历打印链表
void printList(ListNode* head) {
while (head != NULL) {
printf("%d -> ", head->val);
head = head->next;
}
printf("NULL\n");
}
int main() {
// 初始化示例链表
ListNode* list = createNode(4);
list->next = createNode(7);
list->next->next = createNode(2);
list->next->next->next = createNode(9);
list->next->next->next->next = createNode(6);
printf("Original List:\n");
printList(list);
// 移动最小值到头
moveMinToFront(&list);
printf("\nMinimum Moved to Front:\n");
printList(list);
return 0;
}
```
这个程序首先定义了一个链表结构,然后实现了找到最小值、移动最小值和打印链表的功能。在`main`函数中,创建了一个示例链表并演示了如何应用这些函数。
阅读全文