我正在尝试按排序方式将节点插入到链接列表中, 并保持列表的TAIL和HEAD(最小和最大)
这是我的代码:
void sortedInsert(AutoMotor **head, AutoMotor *new_car)
{
AutoMotor* current;
/* Special case for the head end */
if (*head == NULL || (*head)->id >= new_car->id)
{
new_car->next = *head;
*head = new_car;
}
else
{
/* Locate the node before the point of insertion */
current = *head;
while (current->next != NULL && current->next->id < new_car->id)
{
current = current->next;
}
int MAX = current->id;
new_car->next = current->next;
current->next = new_car;
}
printf("new car add successfully to M\n\n");
}
如何提取min&amp;这个函数的最大值(在O(1)中)(我想打印它们)?
感谢您的帮助
答案 0 :(得分:0)
您可以为旧的最小值和旧的最大值(指针或引用)添加两个参数,并在每次插入时更新它们。
根据狮子座编辑评论:
void sortedInsert(AutoMotor **head, AutoMotor *new_car, AutoMotor **min, AutoMotor **max)
{
AutoMotor* current;
/* Special case for the head end */
if (*head == NULL || (*head)->id >= new_car->id)
{
new_car->next = *head;
*head = new_car;
*min = *head;
}
else
{
/* Locate the node before the point of insertion */
current = *head;
while (current->next != NULL && current->next->id < new_car->id)
{
current = current->next;
}
//int MAX = current->id;
new_car->next = current->next;
current->next = new_car;
if ( current->next == NULL )
{
*max = current;
}
}
printf("new car add successfully to M\n\n");
}
答案 1 :(得分:0)
根据您在问题中提供的信息,最能帮助您的数据结构是AVL树:
插入新值需要O(log(n))
,删除和查找它也是如此。
此外,您需要在侧面保存该AVL树,每次向树中插入新值时,都会向链表中添加一个新节点(以便链表和AVL树中的节点数为你只需在树上进行in order
遍历,然后在O(n)
中以排序的方式为你提供值,意味着,插入新元素并获取排序列表需要O(log(n)) + O(n) = O(n)
如果你能想到它,那么为了获得O(1)
中的最小值和最大值现在非常容易(如果你有一个排序的元素,我确定你已经想到它了。)
Here是我几周前制作的C ++中AVL树的一个实现,你可以就任何问题与我联系