我们在上一篇文章中介绍了链表。我们当时还创建了一个包含3个节点的简单链表,并探讨了链表的遍历。
本文讨论的所有程序都基于以下链表表示方式。
C
CODEBLOCK_f6254e47
在本文中,我们将讨论在链表中插入新节点的方法。我们可以通过三种方式添加节点:
1) 在链表的最前端
2) 在给定节点之后。
3) 在链表的末尾。
推荐:请在查看解决方案之前,先在“练习”上尝试解决它。
在链表前端添加节点: (4步流程)
新节点总是添加在给定链表的头节点之前。新添加的节点将成为链表新的头节点。例如,如果给定的链表是 10->15->20->25,我们在前端添加一个项 5,那么链表将变成 5->10->15->20->25。让我们把在链表前端添加节点的函数称为 push()。push() 必须接收一个指向头指针的指针,因为 push 必须修改头指针,使其指向新节点(参阅此处)。
<a href="https://media.geeksforgeeks.org/wp-content/cdn-uploads/gq/2013/03/Linkedlistinsertatstart.png"><img src="https://media.geeksforgeeks.org/wp-content/cdn-uploads/gq/2013/03/Linkedlistinsertat_start.png" alt="linkedlistinsertatstart" />
以下是在前端添加节点的4个步骤。
C
CODEBLOCK_783155bc
push() 的时间复杂度是 O(1),因为它执行的工作量是恒定的。
在给定节点之后添加节点: (5步流程)
我们给定了一个指向某个节点的指针,新节点将被插入到该给定节点之后。
<a href="https://media.geeksforgeeks.org/wp-content/cdn-uploads/gq/2013/03/Linkedlistinsertmiddle.png"><img src="https://media.geeksforgeeks.org/wp-content/cdn-uploads/gq/2013/03/Linkedlistinsertmiddle.png" alt="linkedlistinsertmiddle" />
C
CODEBLOCK_e70e956b
insertAfter() 的时间复杂度是 O(1),因为它执行的工作量是恒定的。
在链表末尾添加节点: (6步流程)
新节点总是添加在给定链表的最后一个节点之后。例如,如果给定的链表是 5->10->15->20->25,我们在末尾添加一个项 30,那么链表将变成 5->10->15->20->25->30。
由于链表通常由其头节点表示,我们必须遍历链表直到末尾,然后改变最后一个节点的 next 指向新节点。
<a href="https://media.geeksforgeeks.org/wp-content/cdn-uploads/gq/2013/03/Linkedlistinsertlast.png"><img src="https://media.geeksforgeeks.org/wp-content/cdn-uploads/gq/2013/03/Linkedlistinsertlast.png" alt="linkedlistinsertlast" />
以下是在末尾添加节点的6个步骤。
C
“
// 给定一个指向链表头部的指针引用(指针的指针)和一个整数,
// 在末尾追加一个新节点
void append(struct Node head_ref,
int new_data)
{
// 1. 分配节点
struct Node* new_node =
(struct Node*) malloc(sizeof(struct Node));
// 用于步骤5
struct Node last = head_ref;
// 2. 放入数据
newnode->data = newdata;
// 3. 这个新节点将成为最后一个节点,所以将其next设为NULL
new_node->next = NULL;
// 4. 如果链表为空,则将新节点设为头节点
if (*head_ref == NULL)
{
*headref = newnode;
return;
}
// 5. 否则,遍历直到最后一个节点
while (last->next