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

有哪些程序网站品牌和商标的区别

有哪些程序网站,品牌和商标的区别,北京到安阳的高铁,怎嘛做网站什么是单链表单链表由一系列节点组成,每个节点包含数据和指向下一个节点的引用。与数组的连续存储不同,单链表的节点可分散在内存中,通过指针连接形成链式结构。以下是单链表节点的典型定义:Java 示例:/*** 单链表节点…

什么是单链表

单链表由一系列节点组成,每个节点包含数据和指向下一个节点的引用。与数组的连续存储不同,单链表的节点可分散在内存中,通过指针连接形成链式结构。以下是单链表节点的典型定义:


Java 示例:

/*** 单链表节点定义* @param <E> 节点数据类型*/
public class ListNode<E> {/** 节点存储的数据 */E data;/** 指向下一个节点的引用 */ListNode<E> next;/*** 构造函数* @param data 节点数据*/public ListNode(E data) {this.data = data;this.next = null;}/*** 带后继节点的构造函数* @param data 节点数据* @param next 后继节点*/public ListNode(E data, ListNode<E> next) {this.data = data;this.next = next;}
}

C# 示例:

/// <summary>
/// 单链表节点定义
/// </summary>
/// <typeparam name="T">节点数据类型</typeparam>
public class ListNode<T>
{/// <summary>/// 节点存储的数据/// </summary>public T Data { get; set; }/// <summary>/// 指向下一个节点的引用/// </summary>public ListNode<T> Next { get; set; }/// <summary>/// 构造函数/// </summary>/// <param name="data">节点数据</param>public ListNode(T data){Data = data;Next = null;}/// <summary>/// 带后继节点的构造函数/// </summary>/// <param name="data">节点数据</param>/// <param name="next">后继节点</param>public ListNode(T data, ListNode<T> next){Data = data;Next = next;}
}

链表的优势与局限性

优势:

  1. 内存利用效率高:节点无需连续存储,可动态分配,适应零散内存。

  2. 无需扩缩容:增删节点只需调整指针,无需数据搬移,理论上容量无限。

局限性:

  • 不支持随机访问:访问第 n 个节点需从头遍历,时间复杂度为 O(n)。

相比之下,数组通过连续内存实现 O(1) 的随机访问,但增删操作可能触发数据搬移和扩缩容(O(n))。


单链表的基本操作

首先实现创建链表的辅助方法,便于后续操作演示:

Java 示例:

/*** 根据数组创建单链表* @param array 源数据数组* @param <T> 数据类型* @return 链表头节点*/
public static <T> ListNode<T> createLinkedList(T[] array) {if (array == null || array.length == 0) {return null;}ListNode<T> head = new ListNode<>(array[0]);ListNode<T> current = head;for (int i = 1; i < array.length; i++) {current.next = new ListNode<>(array[i]);current = current.next;}return head;
}

C# 示例:

/// <summary>
/// 根据数组创建单链表
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <param name="array">源数据数组</param>
/// <returns>链表头节点</returns>
public static ListNode<T> CreateLinkedList<T>(T[] array)
{if (array == null || array.Length == 0){return null;}var head = new ListNode<T>(array[0]);var current = head;for (int i = 1; i < array.Length; i++){current.Next = new ListNode<T>(array[i]);current = current.Next;}return head;
}

查与改

遍历与查找

遍历单链表需从头节点开始,沿 next 指针访问:

Java 示例:

ListNode head = createLinkedList(new int[]{1, 2, 3, 4, 5});
for (ListNode p = head; p != null; p = p.next) {System.out.println(p.val);
}

C# 示例:

ListNode head = CreateLinkedList(new int[]{1, 2, 3, 4, 5});
for (ListNode p = head; p != null; p = p.next) {Console.WriteLine(p.val);
}

查找或修改特定索引的节点需从头遍历,时间复杂度为 O(n)。

头部插入

将新节点插入链表头部,更新头指针:

Java 示例:

ListNode head = createLinkedList(new int[]{1, 2, 3, 4, 5});
ListNode newNode = new ListNode(0);
newNode.next = head;
head = newNode; // 链表变为 0 -> 1 -> 2 -> 3 -> 4 -> 5

C# 示例:

ListNode head = CreateLinkedList(new int[]{1, 2, 3, 4, 5});
ListNode newNode = new ListNode(0);
newNode.next = head;
head = newNode; // 链表变为 0 -> 1 -> 2 -> 3 -> 4 -> 5

时间复杂度:O(1)。

尾部插入
遍历至尾节点,添加新节点:

Java 示例:

ListNode head = createLinkedList(new int[]{1, 2, 3, 4, 5});
ListNode p = head;
while (p.next != null) {p = p.next;
}
p.next = new ListNode(6); // 链表变为 1 -> 2 -> 3 -> 4 -> 5 -> 6

C# 示例:

ListNode head = CreateLinkedList(new int[]{1, 2, 3, 4, 5});
ListNode p = head;
while (p.next != null) {p = p.next;
}
p.next = new ListNode(6); // 链表变为 1 -> 2 -> 3 -> 4 -> 5 -> 6

时间复杂度:O(n),因需遍历。若持有尾节点引用,可优化为 O(1)。

中间插入

在第 k 个节点后插入,需找到前驱节点:

Java 示例:

ListNode head = createLinkedList(new int[]{1, 2, 3, 4, 5});
ListNode p = head;
for (int i = 0; i < 2; i++) {p = p.next; // 定位第 3 个节点
}
ListNode newNode = new ListNode(6);
newNode.next = p.next;
p.next = newNode; // 链表变为 1 -> 2 -> 3 -> 6 -> 4 -> 5

C# 示例:

ListNode head = CreateLinkedList(new int[]{1, 2, 3, 4, 5});
ListNode p = head;
for (int i = 0; i < 2; i++) {p = p.next; // 定位第 3 个节点
}
ListNode newNode = new ListNode(6);
newNode.next = p.next;
p.next = newNode; // 链表变为 1 -> 2 -> 3 -> 6 -> 4 -> 5

时间复杂度:O(n),因需遍历至前驱节点。

头部删除

将头指针移至下一节点:

Java 示例:

ListNode head = createLinkedList(new int[]{1, 2, 3, 4, 5});
head = head.next; // 链表变为 2 -> 3 -> 4 -> 5

C# 示例:

ListNode head = CreateLinkedList(new int[]{1, 2, 3, 4, 5});
head = head.next; // 链表变为 2 -> 3 -> 4 -> 5

时间复杂度:O(1)。在 Java 和 C# 中,旧头节点无引用后会被垃圾回收,无需显式置空 next

尾部删除

找到倒数第二个节点,置其 next 为 null:

Java 示例:

ListNode head = createLinkedList(new int[]{1, 2, 3, 4, 5});
ListNode p = head;
while (p.next.next != null) {p = p.next;
}
p.next = null; // 链表变为 1 -> 2 -> 3 -> 4

C# 示例:

ListNode head = CreateLinkedList(new int[]{1, 2, 3, 4, 5});
ListNode p = head;
while (p.next.next != null) {p = p.next;
}
p.next = null; // 链表变为 1 -> 2 -> 3 -> 4

时间复杂度:O(n)。

中间删除

删除第 k 个节点,需调整前驱节点的指针:

Java 示例:

ListNode head = createLinkedList(new int[]{1, 2, 3, 4, 5});
ListNode p = head;
for (int i = 0; i < 2; i++) {p = p.next; // 定位第 3 个节点
}
p.next = p.next.next; // 链表变为 1 -> 2 -> 3 -> 5

C# 示例:

ListNode head = CreateLinkedList(new int[]{1, 2, 3, 4, 5});
ListNode p = head;
for (int i = 0; i < 2; i++) {p = p.next; // 定位第 3 个节点
}
p.next = p.next.next; // 链表变为 1 -> 2 -> 3 -> 5

时间复杂度:O(n)。

小结

单链表的增删查改操作比数组复杂,因节点非连续存储,需遍历定位前驱或后驱节点。不同位置(头部、尾部、中间)的操作逻辑各异,且需考虑边界情况(如空链表)。

后续章节将介绍双向链表和“虚拟头节点”技巧,以统一操作并简化边界处理。

http://www.dtcms.com/a/601408.html

相关文章:

  • C语言编译器选择指南 | 初学者实用教程
  • 小智机器人MCP
  • 对于给不良网站发律师函如何做收银系统哪个软件好
  • 网站管理工作总结安阳县事业单位招聘2021
  • RK-Android11-修改系统的鼠标光标
  • vs2022 IDE扩展无法卸载/VSI 插件卸载及实例清理
  • 华为OD机试 双机位A卷 - 智能驾驶 (JAVA Python C++ JS GO)
  • 广州网站制作实力乐云seo怎么提高网站的流量
  • 开源工具 yt-dlp 超简易上手版
  • 郑州网站优化外包顾问上海网站建设 分类广告
  • SSM基于WEB的教学质量评价系统的设计与实现p9ak6(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • PCB常用规则
  • Node.js 集成百度语音
  • 求一个网站开发接项目的平台做网站的外包需要分享客户信息
  • 怎么用PS做网站横幅wordpress 抽奖
  • 【开题答辩全过程】以 基于Vue.js和Node.js的在线旅游平网站的设计和实现为例,包含答辩的问题和答案
  • MySQL快速入门——用户管理
  • 中咨城建设计南京网站网站建设南昌
  • 大连网站制作流程在哪里可以免费自学seo课程
  • [智能体设计模式]第3章 并行化
  • Prisma 原生 SQL 多表联查完整指南
  • 哪个网站原创文章旅游集团网站建设
  • AI搜索不提你的品牌?从GEO诊断开始
  • Elasticsearch 7.6 安装 Jieba 中文分词插件完整教程
  • OpenCV 加载时出现 `no opencv_java451 in java.library.path` 错误
  • 【CCF-CSP】05-02日期计算
  • 如何实施网站推广wordpress您的密码重设链接无效
  • GlobalFoundries从台积电获得GaN技术许可
  • ModelEngine 智能体开发实战:2 个月 3 个项目从知识库到多 Agent 协作完整指南
  • TensorFlow深度学习实战(43)——TensorFlow.js