设计一个算法,通过一趟遍历,确定长度为n的单列表中值最小的节点,返回该节点的数据域。
int min(list l)
{
node *p = l->head;
int m = head->value;
while (1)
{
p = p->next;
if (!p) break;
if (m > p->value) m = p->value;
}
return m;
}
可以使用一个变量 min_value 来记录遍历过程中的最小值,并用一个指针 min_node 指向对应的节点。初始时,将 min_value 赋值为列表的第一个节点的数据域,并将 min_node 指向第一个节点。
然后从第二个节点开始,遍历整个单列表,每次检查当前节点的数据域是否比 min_value 小,如果是,则将 min_value 更新为该节点的数据域,并将 min_node 指向该节点。
最后遍历完整个列表后,min_node 就指向了值最小的节点,返回其数据域即可。
下面是算法的伪代码:
function findMinValue(head):
// 初始化最小值和最小节点
min_value = head.data
min_node = head
// 从第二个节点开始遍历
curr = head.next
while curr != null:
// 如果当前节点的数据域比最小值小,则更新最小值和最小节点
if curr.data < min_value:
min_value = curr.data
min_node = curr
// 移动到下一个节点
curr = curr.next
// 返回最小节点的数据域
return min_node.data