一个值(整数)不重复带头结点单链表L(L中各个结点的值是无序的),写一个函数实现将L中的值最小结点移到L的最前面,使其成为第一个结点;用C语言
时间: 2024-11-25 15:19:55 浏览: 10
为了实现这个功能,你可以创建一个名为`moveMinToFront`的函数,该函数接受一个指向链表头节点的指针作为参数。这里是一个简单的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
typedef struct Node {
int val; // 节点值
struct Node* next; // 指向下一个节点的指针
} Node;
// 初始化链表头节点
Node* createList(int* arr, int size) {
Node* head = (Node*)malloc(sizeof(Node));
head->val = arr[0];
head->next = NULL;
for (int i = 1; i < size; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->val = arr[i];
newNode->next = head->next;
head->next = newNode;
}
return head;
}
// 辅助函数,用于找到链表中的最小值
int findMin(Node* node) {
while (node->next != NULL) {
if (node->next->val < node->val) {
node = node->next;
} else {
break;
}
}
return node->val;
}
// 主函数,移动最小元素到链表头部
void moveMinToFront(Node** head_ref) {
if (*head_ref == NULL || (*head_ref)->next == NULL) {
return; // 链表为空或只有一个元素,不需要操作
}
int minVal = findMin(*head_ref);
Node* minNode = *head_ref;
while (minNode != NULL && minNode->val == minVal) {
minNode = minNode->next;
}
// 将minNode插入到链表头部
Node* current = *head_ref;
while (current->next != minNode) {
current = current->next;
}
current->next = minNode->next;
minNode->next = *head_ref;
*head_ref = minNode;
}
// 打印链表
void printList(Node* head) {
while (head != NULL) {
printf("%d -> ", head->val);
head = head->next;
}
printf("NULL\n");
}
int main() {
int arr[] = {4, 7, 2, 9, 1};
int size = sizeof(arr) / sizeof(arr[0]);
Node* listHead = createList(arr, size);
printf("Original List: ");
printList(listHead);
moveMinToFront(&listHead);
printf("\nList with Min at Front: ");
printList(listHead);
return 0;
}
```
在这个代码中,首先我们创建了一个链表,然后通过`findMin`函数找到最小值节点。接着,在`moveMinToFront`函数中,我们遍历链表直到找到第一个大于最小值的节点,然后调整节点连接,使得最小值节点成为新的头节点。
阅读全文