当前位置: 首页 > news >正文

学习数据节构和算法的第13天

单链表

​ 单链表是一种常见的数据结构,由一个个节点组成。

每个节点包含两个部分:数据部分指针部分。

**数据部分:**存储节点中的具体数据。可以是任何类型的数据,如整数、浮点数、字符串等。

**指针部分:**指向下一个节点的地址。通过指针,将多个节点连接在一起形成链表。

链表的第一个节点称为头节点最后一个节点的指针为空指针(NULL或None)表示链表的结束

链表的优点是插入和删除操作的时间复杂度为O(1),不需要像数组一样移动元素。缺点是访问元素时需要遍历整个链表,时间复杂度为O(n)。

class Node:def __init__(self, data):self.data = dataself.next = None
# 创建节点
node1 = Node(1)
node2 = Node(2)
node3 = Node(3)
# 构建链表关系
node1.next = node2
node2.next = node3

链表的移除

#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node{int data;              // 节点数据struct Node* next;     // 指向下一个节点的指针
} Node;
// 初始化链表节点
Node* initNode(int data){Node* newNode = (Node*)malloc(sizeof(Node));    // 分配新节点的内存newNode->data = data;newNode->next = NULL;return newNode;
}
// 移除指定数值的节点
Node* removeElements(Node* head, int val){Node* dummy = initNode(-1);    // 设置一个虚拟头节点,方便处理删除头节点的情况dummy->next = head;            // 将虚拟头节点指向原链表的头节点Node* current = dummy;         // 当前节点指针while (current->next) {if (current->next->data == val){Node* temp = current->next;current->next = current->next->next;free(temp);             // 释放目标节点的内存} else {current = current->next;}}return dummy->next;             // 返回排除目标节点后的链表头节点
}
// 显示链表元素
void display(Node* head){Node* current = head;while (current) {printf("%d -> ", current->data);current = current->next;}printf("NULL\n");
}
int main() 
{// 创建链表: 1 -> 2 -> 3 -> 4 -> 5 -> NULLNode* head = initNode(1);head->next = initNode(2);head->next->next = initNode(3);head->next->next->next = initNode(4);head->next->next->next->next = initNode(5);printf("Original linked list: ");display(head);    // 显示原链表// 移除数值为3的节点head = removeElements(head, 3);printf("After removing elements: ");display(head);    // 显示移除元素后的链表return 0;
}

相关文章:

  • 【PHP进阶】Redis批处理缓存
  • AI绘画与修图:重塑数字艺术的新纪元
  • MedicalGPT 训练医疗大模型,实现了包括增量预训练、有监督微调、RLHF(奖励建模、强化学习训练)和DPO(直接偏好优化)
  • vue2与vue3的diff算法有什么区别
  • 带你快速学习Python数据类型转换
  • 《PCI Express体系结构导读》随记 —— 第I篇 第3章 PCI总线的数据交换(8)
  • Linux Driver | 设备树开发之初识设备树
  • Android14 InputManager-ANR原理
  • 华清远见作业第四十一天——Qt(第三天)
  • Redis高性能原理
  • 掌握Docker:让你的应用轻松部署和管理
  • 使用openai-whisper实现语音转文字
  • 外汇天眼:外汇交易不可不知的8大风险!
  • 欧放ER-2024年1月 AI论文速递
  • Draw.io绘制UML图教程
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • iOS小技巧之UIImagePickerController实现头像选择
  • JAVA多线程机制解析-volatilesynchronized
  • vue2.0项目引入element-ui
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 推荐一个React的管理后台框架
  • No resource identifier found for attribute,RxJava之zip操作符
  • 2017年360最后一道编程题
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​​​​​​​​​​​​​​Γ函数
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • ###STL(标准模板库)
  • #android不同版本废弃api,新api。
  • #git 撤消对文件的更改
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (rabbitmq的高级特性)消息可靠性
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (转)Sql Server 保留几位小数的两种做法
  • .Net 垃圾回收机制原理(二)
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET关于 跳过SSL中遇到的问题
  • .NET基础篇——反射的奥妙
  • @Autowired注解的实现原理
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [20160902]rm -rf的惨案.txt
  • [android] 看博客学习hashCode()和equals()
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk --不会编程的崽
  • [iOS]iOS获取设备信息经常用法
  • [Linux] Linux入门必备的基本指令(不全你打我)
  • [Linux]知识整理(持续更新)
  • [NOIP2013]华容道
  • [NOIP2014普及组]子矩阵
  • [TS] Class Properties Public, Private and Read Only Modifiers
  • [UIM]论文解读:subword Regularization: Multiple Subword Candidates
  • [Unity Sentis] Unity Sentis 详细步骤工作流程
  • [创业] 让创业者惊讶的19个真相