单链表的插入操作

如何让小智AI成为你的第二大脑——“免费”送小智AI智能音箱征文活动 10w+人浏览 413人参与

AI助手已提取文章相关产品:

1.头插法:将新结点插入到头结点之后、当前首元结点之前(插入后新结点成为新的首元结点)

(补充:头插法的核心是 “插在有效数据的最前端”,易误解为 “替换首元结点”,实际是插在首元结点前面,原首元结点变为第二个有效结点。)

2.尾插法:将新结点插入到链表的尾结点之后(插入后新结点成为新的尾结点)。核心步骤:① 获取当前尾结点的地址:通过 while 循环遍历链表(从表头开始),当指针p->next == NULL时,p 即为当前尾结点;② 为待插入的新结点开辟内存空间(使用 malloc 创建新结点,建议命名为new_node,避免与遍历的 p 重名);③ 给新结点赋值:new_node->data = e;④ 建立连接:将原尾结点的next指针指向新结点(p->next = new_node);⑤ 标记新结点为尾结点:将新结点的next指针置为 NULL(new_node->next = NULL)。

3.在指定位置插入:

改变箭头指向时顺序要严格按照上图所示,目的是:防止断链,先让插入元素指向前一个元素指向的位置,再将前一个元素的指向改为要插入的元素

具体的插入操作:首先找到要插入位置的前一个结点(通过while遍历查找),其次为要插入的节点开辟新的内存空间,最后通过以下图片的操作,实现链表的连接

最后一行我在理解的时候出现了误区,为什么不是p->next=q->data(从图2的指向中会得到这样的结论),可以从以下两个角度理解:

1.类型不匹配:p->next指向的是结点,而结点是指针类型的变量,data是数据内容,存放的是int类型的变量

2.逻辑上讲不通:插入q的本质是将q这个完整的结点插到p和p原先的后继结点之间

4.豆包总结:

链表插入的核心是操作 “结点的 next 指针”(而非 “箭头”),所有插入方法的本质都是:

  • 头插法:新结点插在头结点后、首元结点前,成为新首元;
  • 尾插法:新结点插在尾结点后,成为新尾结点(需先找尾、再连原尾到新结点、最后新结点 next 置 NULL);
  • 指定位置插入:先让新结点连后继,再让前驱连新结点(防断链);
  • 所有插入中,next指针只能指向 “结点(Node*)”,不能指向 “数据(data)”—— 类型和逻辑都不允许。

您可能感兴趣的与本文相关内容

### 单链表插入操作的实现方法 在单链表中实现节点插入操作,通常涉及三种常见的情况:头部插入、中间插入和尾部插入。以下是每种情况下具体的实现细节。 #### 头部插入 当需要在链表插入一个新节点时,首先创建一个新的节点并将它的 `next` 指针指向当前的头节点。随后更新头指针使其指向这个新的节点[^3]。 ```c void insertAtHead(struct Node** head_ref, int new_data) { struct Node* new_node = (struct Node*)malloc(sizeof(struct Node)); new_node->data = new_data; new_node->next = *head_ref; // 将新节点的 next 指向原头节点 *head_ref = new_node; // 更新头指针到新节点 } ``` #### 中间插入 对于在链表中间某个特定位置插入节点的操作,需先定位到目标位置的前驱节点(即第 i-1 个节点)。一旦找到该节点,则可以按照如下方式完成插入: 1. 创建一个新节点并设置其数据字段; 2. 设置新节点的 `next` 指针指向当前选定节点的下一个节点; 3. 修改选定节点的 `next` 指针以指向新创建的节点。 需要注意的是,在执行此过程之前应验证所给定的位置是否合法以及是否存在足够的空间来存储新增加的数据项[^1]。 ```c void insertAfterNode(struct Node* prev_node, int new_data) { if (prev_node == NULL) { printf("The given previous node cannot be NULL"); return; } struct Node* new_node = (struct Node*) malloc(sizeof(struct Node)); new_node->data = new_data; new_node->next = prev_node->next; prev_node->next = new_node; } ``` #### 尾部插入 要在链表最后添加一个元素,则必须遍历整个列表直至发现最后一个非空链接为止。之后遵循类似的逻辑构建新单元格,并将其附加到最后端点上。 ```c void append(struct Node** head_ref, int new_data) { /* Allocate memory for the node */ struct Node* new_node = (struct Node*)malloc(sizeof(struct Node)); struct Node *last = *head_ref; /* Set data in new node */ new_node->data = new_data; /* This new node is going to be last node, so make its next as NULL*/ new_node->next = NULL; /* If linked list is empty, then make the new node as head */ if (*head_ref == NULL){ *head_ref = new_node; return; } while(last->next !=NULL){ last=last->next; } /* Change the next of last node */ last->next=new_node; return; } ``` 以上展示了如何通过编程语言C来进行基本类型的单链表节点插入功能的设计与编码实践[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值