设计一个算法,通过一趟遍历确定长度为n的单链表中值最大的节点,返回该节点的数据域。 输入样例: n 12 链表值:5 6 7 3 6 8 9 11 13 4 2 0 输出:13 c语言
时间: 2024-09-11 17:17:04 浏览: 41
要设计一个算法,通过一趟遍历确定长度为n的单链表中值最大的节点,并返回该节点的数据域,我们可以遵循以下步骤:
1. 初始化两个指针,`head`指向链表的头节点,`maxNode`用于追踪当前遇到的最大值节点。
2. 遍历链表,对于每个节点,检查它的值是否大于`maxNode`指向节点的值。
3. 如果是,更新`maxNode`指向当前节点。
4. 遍历结束后,`maxNode`指向的节点即为值最大的节点。
5. 返回`maxNode`的数据域。
下面是用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;
}
// 插入节点的函数,用于构建链表
void insertNode(ListNode** head, int val) {
ListNode* newNode = createNode(val);
if (*head == NULL) {
*head = newNode;
} else {
ListNode* current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
}
// 查找单链表中最大值节点的数据域
int findMaxNodeValue(ListNode* head) {
if (head == NULL) return INT_MIN; // 如果链表为空,返回最小整数作为标志
ListNode* maxNode = head;
ListNode* current = head->next;
while (current != NULL) {
if (current->val > maxNode->val) {
maxNode = current;
}
current = current->next;
}
return maxNode->val;
}
int main() {
ListNode* head = NULL;
int n = 12;
// 假设链表的值已经按照题目给定的顺序输入完毕
int values[] = {5, 6, 7, 3, 6, 8, 9, 11, 13, 4, 2, 0};
for (int i = 0; i < n; ++i) {
insertNode(&head, values[i]);
}
// 输出最大值节点的数据域
printf("%d\n", findMaxNodeValue(head));
return 0;
}
```
这段代码首先定义了链表节点的结构体和两个辅助函数,用于创建新节点和将新节点插入到链表的末尾。然后定义了`findMaxNodeValue`函数来找到链表中最大值节点的数据域。最后在`main`函数中,我们构建了一个具体的链表,并调用`findMaxNodeValue`函数输出最大值节点的数据域。
阅读全文