【数据结构】单链表的尾插法

embedded/2024/9/24 17:31:14/

尾插法是一种在链表末尾插入新元素的方法,它的核心思想是保持链表的尾部指针(或称为尾节点),这样可以在常数时间内完成尾部插入操作。尾插法的主要步骤如下:

  1. 创建新节点:首先,根据需要插入的数据创建一个新的链表节点。

  2. 定位尾部:如果是第一次插入,即链表为空,新节点直接成为头节点。如果链表不为空,需要定位到链表的尾部。

  3. 更新尾部:将新节点插入到当前尾部节点的后面,并更新尾部指针(或尾部节点的next指针)以指向新节点。

  4. 维护尾部指针:在插入操作完成后,确保尾部指针指向新的尾部节点。在某些实现中,可能会使用一个额外的指针来始终指向尾部节点,这样可以避免每次插入时都需要遍历链表来找到尾部。

尾插法的优点是插入操作的时间复杂度为O(1),因为不需要遍历链表来找到插入位置,只需要修改尾部节点的next指针。这种方法在实现队列时非常有用,因为队列的入队操作通常需要在尾部插入元素。

在双向链表或循环链表中,尾插法还需要维护额外的指针,例如前驱指针和循环链表的头节点指针,但基本思想是相同的:找到尾部并在其后面插入新节点。

以下是一个使用尾插法在单向链表中插入新元素的C语言示例:

#include <stdio.h>
#include <stdlib.h>// 定义链表节点结构体
typedef struct Node {int data;struct Node* next;
} Node;// 创建一个新的节点
Node* createNode(int data) {Node* newNode = (Node*)malloc(sizeof(Node));if (!newNode) {printf("内存分配失败\n");exit(0);}newNode->data = data;newNode->next = NULL;return newNode;
}// 使用尾插法在链表尾部插入新节点
void insertAtTail(Node** head, int data) {Node* newNode = createNode(data);if (*head == NULL) {// 如果链表为空,新节点成为头节点*head = newNode;return;}Node* current = *head;// 遍历链表直到找到最后一个节点while (current->next != NULL) {current = current->next;}// 将新节点插入到链表的尾部current->next = newNode;
}// 打印链表
void printList(Node* head) {Node* current = head;while (current != NULL) {printf("%d -> ", current->data);current = current->next;}printf("NULL\n");
}// 主函数
int main() {Node* head = NULL;insertAtTail(&head, 1);insertAtTail(&head, 3);insertAtTail(&head, 5);insertAtTail(&head, 7);printf("链表元素: ");printList(head);return 0;
}

在这个例子中,insertAtTail函数接受一个指向头节点的指针的指针,以及要插入的新节点的数据。首先,它创建一个新节点。然后,如果链表为空,新节点成为头节点。如果链表不为空,函数遍历链表直到找到最后一个节点,并将新节点插入到最后一个节点的后面。

printList函数用于打印链表中的所有元素,以验证尾插法是否正确执行。

结语

以上就是尾插法的基本使用,本次代码分享到此结束。

最后的最后,还请大家点点赞,点点关注,谢谢大家!


http://www.ppmy.cn/embedded/16989.html

相关文章

iOS原生与H5交互方法

UIWebView Objective-C 调用 JavaScript 在使用UIWebView时&#xff0c;可以使用stringByEvaluatingJavaScriptFromString:方法来执行JavaScript代码。 示例代码&#xff1a; NSString *result [webView stringByEvaluatingJavaScriptFromString:"returnFunction()&q…

C++:拷贝构造函数的初始化列表

拷贝构造函数的初始化列表是在拷贝构造函数的定义中出现的一组初始值&#xff0c;用于初始化新创建的对象的成员变量。它的语法是在构造函数的声明后面使用冒号&#xff08;:&#xff09;来开头&#xff0c;然后列出要初始化的成员变量和它们的初始值。初始化列表的优点在于它允…

4、Flink执行模式(流/批)详解(下)

1、执行模式设置 import org.apache.flink.api.common.RuntimeExecutionMode; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;/*** bin/flink run -Dexecution.runtime-modeBATCH <jarFile>*/ public class _01_RuntimeMode {public s…

学习OpenCV——CV_8UC1、CV_16UC1、CV_32FC1等对应的整数值及计算方法(一)

学习OpenCV——CV_8UC1、CV_16UC1、CV_32FC1等对应的整数值及计算方法&#xff08;一&#xff09; 1.代码段2.计算方法举例3.直接给出其余对应结果 1.代码段 以下取自OpenCV文档 #define CV_BIG_INT(n) #define CV_BIG_UINT(n) #define CV_CN_MAX 512 #define CV…

Node.js -- path模块

path.resolve(常用) // 导入fs const fs require(fs); // 写入文件 fs.writeFileSync(_dirname /index.html,love); console.log(_dirname /index.html);// D:\nodeJS\13-path\代码/index.html 我们之前使用的__dirname 路径 输出的结果前面是正斜杠/ &#xff0c;后面部分是…

使用Uiautomotorviewer无法获取手机页面元素+解决办法

在进行 Android 应用程序开发或测试时&#xff0c;有时会遇到以下错误&#xff1a; Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException这个错误可能会导致开发或测试过程中的一些困扰&#xff0c;但有一个简单的解决方法&#xff1a; 解决方法…

【blog项目】layui与jquery冲突导致鼠标悬停事件失效、如何调用layui.use()作用域里的方法

blog项目前台展示——查询数据库中的文章类型并展示时出现的bug 1 正常演示 2 用jquery查询数据库并添加到页面后 3 相关代码 <script src"/static/jquery-2.1.4.js"></script> <script src"/static/layui/layui.js"></script> …

迅雷不限速破解方法

背景&#xff1a;现在迅雷和百度云的下载速度真的太恶心了&#xff0c;所以总有大佬可以采用厉害的方法进行破解&#xff0c;在网上看了一圈&#xff0c;很多都是骗人或者是无效的&#xff0c;找了一个靠谱的方法&#xff0c;亲测速度能达到10M以上&#xff0c;非常给力。 以下…