求带头结点的单链表最大值
时间: 2024-06-12 07:04:39 浏览: 53
假设单链表的头结点为head,那么可以使用一个变量max来记录当前的最大值,然后遍历链表,依次比较每个节点的值和max的大小,如果节点的值比max大,则更新max的值。最后遍历完成后,max就是链表中的最大值。
代码示例:
```
// 带头结点的单链表结构体
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
int getMax(ListNode* head) {
if (head == NULL || head->next == NULL) {
return INT_MIN; // 如果链表为空或只有一个节点,则返回最小值
}
int maxVal = head->next->val; // 初始化最大值为第一个节点的值
ListNode* cur = head->next->next; // 从第二个节点开始遍历
while (cur != NULL) {
if (cur->val > maxVal) {
maxVal = cur->val; // 更新最大值
}
cur = cur->next;
}
return maxVal;
}
```
注意:在计算最大值时,需要先判断链表是否为空或只有一个节点,如果是,则返回INT_MIN或该节点的值。
相关问题
用数据结构与算法的方式设计带头结点单链表的算法getMinData(SLinkNode *head),返回单链表结点数据域的最小值,如果原单链表为空则返回-1。假设单链表结点数据域的值为正整数
设计一个带头结点的单链表`SLinkNode`,用于获取链表中最小数据值的算法`getMinData(SLinkNode *head)`,可以按以下步骤进行:
1. 初始化两个变量`min_val`和`current`。`min_val`设为`INT_MAX`(表示最大负整数),`current`设为`head`。
2. 当`current`不为`NULL`时,进入循环,遍历链表:
```c++
while (current != NULL) {
// 检查当前节点的数据值与已找到的最小值比较
if (current->data < min_val) {
min_val = current->data; // 更新最小值
}
// 移动到下一个节点
current = current->next;
}
```
3. 循环结束后,`min_val`存储的就是链表中的最小数据值。如果整个链表为空,即`current == NULL`时,`min_val`依然保持初始的`INT_MAX`,因此返回`min_val`即可。
以下是完整的伪代码形式:
```cpp
int getMinData(SLinkNode* head) {
if (!head) return -1; // 如果链表为空,返回-1
int min_val = INT_MAX;
SLinkNode* current = head;
while (current) {
if (current->data < min_val) {
min_val = current->data;
}
current = current->next;
}
return min_val;
}
```
在带头结点的单链表的最大值前面插入一个新结点
可以按照以下步骤实现:
1. 遍历链表,找到最大值节点的前一个节点。
2. 创建新节点,并将新节点的 next 指向最大值节点。
3. 将最大值节点的前一个节点的 next 指向新节点。
以下是示例代码:
```c
void insert_node_before_max(Node* head, int value) {
Node* prev = head;
Node* curr = head->next;
while (curr != NULL && curr->data < value) {
prev = curr;
curr = curr->next;
}
Node* new_node = (Node*)malloc(sizeof(Node));
new_node->data = value;
new_node->next = prev->next;
prev->next = new_node;
}
```
注意,这里假设链表中的节点数据类型为 int,且链表已经按照从小到大的顺序排好序。如果链表没有排序,则需要先进行排序操作。
阅读全文