为了删除单链表L中的一个最小值结点,我们可以遍历链表,找到最小值结点及其前驱结点,然后修改前驱结点的指针,使其指向最小值结点的下一个结点。以下是算法的解析和代码实现:
- 初始化两个指针pre和cur,分别指向头结点和头结点的下一个结点。
- 初始化一个变量min_val,用于存储当前最小值,将其设置为cur结点的值。
- 初始化一个变量min_pre,用于存储最小值结点的前驱结点,将其设置为头结点。
- 遍历链表,比较cur结点的值与min_val的大小,如果cur结点的值更小,则更新min_val和min_pre。
- 更新pre和cur指针,使它们分别指向下一个结点。
- 当cur为空时,结束遍历。
- 修改min_pre指针,使其指向min_pre的下一个结点的下一个结点,从而删除最小值结点。
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
void delete_min_node(ListNode *head) {
if (!head || !head->next) {
return;
}
ListNode *pre = head;
ListNode *cur = head->next;
int min_val = cur->val;
ListNode *min_pre = head;
while (cur) {
if (cur->val < min_val) {
min_val = cur->val;
min_pre = pre;
}
pre = cur;
cur = cur->next;
}
min_pre->next = min_pre->next->next;
}
注意:这个算法假设链表中至少有一个结点。
标签:pre,结点,cur,历险记,min,有头,最小值,val From: https://www.cnblogs.com/jjjkkklll/p/18151481