最简单的思路是在两个节点中插入新节点d,需要找到插入位置的前节点pre。
什么时候算是找到了pre呢?要么就是pre->next->data >= d->data,在pre和pre->next之间。要么就是pre->next为空,此时在链表末尾插入新节点d。
也就是说,当(pre->next->data < d->data && pre->next != NULL)时,循环继续,继续寻找下一个pre。
然而这个思路是有漏洞的,接下来继续完善。
如果第一个节点就大于d->data,那么程序会在第一个节点后面插入新节点,这显然是错误的,所以需要单独讨论。
如果链表为空,或新节点应该放在头部:
d->next指向head,并让d作为head节点。
否则,进入循环寻找pre并插入d。
void insertInOrder(Node** head, int data) {
Node* newNode = createNode(data);
// 如果链表为空,或新节点应该放在头部
if (*head == NULL || (*head)->data >= newNode->data) {
newNode->next = *head;
*head = newNode;
} else {
// 找到应该插入新节点的位置
Node* current = *head;
while (current->next != NULL && current->next->data < newNode->data) {
current = current->next;
}
newNode->next = current->next;
current->next = newNode;
}
}