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

网站后台都有哪些中国建设工程监理网站

网站后台都有哪些,中国建设工程监理网站,城乡和住房建设部证书信息网,腾讯视频分享到wordpress一.链表1.链表概念链表是一种 物理存储结构上非连续 的存储结构 , 数据元素的逻辑顺序是通过 链表中的引用链接次序实现的注意:从上图中可以看出 , 链表结构在逻辑上是连续的 , 但是在物理上是不连续的现实中的结点一般都是从 堆上申请出来的从堆上申请的空间 , 是按照一定的策…

一.链表

1.链表概念

链表是一种 物理存储结构上非连续 的存储结构 , 数据元素的逻辑顺序是通过 链表中的引用链接次序实现的

注意:

  • 从上图中可以看出 , 链表结构在逻辑上是连续的 , 但是在物理上是不连续的
  • 现实中的结点一般都是从 堆上申请出来的
  • 从堆上申请的空间 , 是按照一定的策略来分配的 , 两次申请的 空间可能连续 , 也可能不连续


2.链表分类(8种)

实际中的链表的结构非常多样 , 以下情况组合起来就有8种

  • 单向或双向
  • 带头结点或者不带头结点
  • 循环或非循环

类型结构特点核心引用域
单向链表每个节点只指向后一个节点,尾节点nextnull,只能从头部遍历next
双向链表每个节点同时指向前后节点,支持双向遍历,尾节点nextnullprev + next
循环链表尾节点的next指向头节点(单向循环)或头节点的prev指向尾节点(双向循环),可循环遍历同单向 / 双向

头结点可以存放数据 , 但是无任何意义


3.链表的实现

  • 无头单项非循环链表的实现
  • 头插法 , 尾插法 , 任意位置插入 , 查找 , 删除 , 长度 , 清空 , 打印等功能 

①接口的实现

public interface IList {//头插法public void addFirst(int data);//尾插法public void addLast(int data);//任意位置插入,第一个数据节点为0号下标public void addIndex(int index,int data);//查找是否包含关键字key是否在单链表当中public boolean contains(int key);//删除第一次出现关键字为key的节点public void remove(int key);//删除所有值为key的节点public void removeAllKey(int key);//得到单链表的长度public int size();public void clear();public void display();
}

②功能的实现

//无头单项非循环链表的实现
public class MyLinkedList implements IList {static class ListNode {public int val;public ListNode next;public ListNode(int val) {this.val = val;}}public ListNode head;//求链表的长度@Overridepublic int size() {if(head == null) {return 0;}else {int len = 0;ListNode cur = head;while (cur.next != null){cur = cur.next;len++;}return len;}}//头插法@Overridepublic void addFirst(int data) {ListNode node = new ListNode(data);if(head == null){head =  node;}else {node.next = head;head = node;}}//尾插法@Overridepublic void addLast(int data) {ListNode node = new ListNode(data);if(head == null){head =  node;}else{ListNode cur = head;while(cur.next!=null){cur = cur.next;}cur.next = node;}}//在下标 index 位置 , 插入 data@Overridepublic void addIndex(int index, int data) {ListNode node = new ListNode(data);int len = size();if(index<0||index>len){throw new IndexOutOfBoundsException("下标越界");}if(index == 0){addFirst(data);}if(index == len){addLast(data);}ListNode cur = head;for (int i = 0; i < index; i++) {cur = cur.next;}node.next = cur.next;cur.next = node;}//查找是否包含关键字key是否在单链表当中@Overridepublic boolean contains(int key) {int len = size();if(len == 0) {return false;}ListNode cur = head;while (cur.next!=null)if(cur.val == key) {return true;}cur = cur.next;return false;}//删除第一次出现关键字为key的节点@Overridepublic void remove(int key) {// 空链表直接返回if(head == null) {return;}// 处理头节点是目标节点的情况if(head.val == key) {head = head.next;return;}// 查找并删除中间/尾部的目标节点ListNode cur = head;while (cur.next != null) {if (cur.next.val == key) {// 找到目标节点,进行删除cur.next = cur.next.next;return; // 只删除第一个匹配的节点}cur = cur.next;}// 循环结束仍未找到,说明链表中没有该节点,无需操作}//删除所有值为key的节点@Overridepublic void removeAllKey(int key) {if(head == null){return;}ListNode prev = head;ListNode cur = head.next;while (cur != null){if(cur.val == key){prev.next = cur.next;cur = cur.next;}else {prev = cur;cur = cur.next;}}if(head.val == key ){head = head.next;}}//清空链表@Overridepublic void clear() {ListNode cur = head;while (cur!=null){ListNode curN = cur.next;cur = null;cur = curN;}head =null;}//打印链表@Overridepublic void display() {ListNode cur = head;while (cur!=null){System.out.println(cur.val+" ");cur = cur.next;}}
}


4.链表与数组的对比

  • 内存分配:链表动态分配内存,数组需连续内存。
  • 访问效率:数组随机访问O(1),链表需遍历O(n)。
  • 插入/删除:链表在已知位置操作更高效(O(1)或O(n)),数组需移动元素(O(n))。
对比维度链表(LinkedList)数组(ArrayList)
内存存储非连续内存,通过引用连接连续内存,元素按索引存储
增删效率头部 / 尾部增删 O (1),中间增删 O (n)(需遍历)尾部增删 O (1),头部 / 中间增删 O (n)(需移动元素)
查询效率按索引查询 O (n)(需遍历)按索引查询 O (1)(直接通过地址偏移获取)
动态扩容无需扩容(节点可动态创建)需扩容(默认扩容为原容量 1.5 倍,浪费内存)
线程安全非线程安全非线程安全
适用场景频繁增删(尤其是头部 / 尾部)、不确定长度频繁查询、已知大致长度


5.总结

  • Java 中链表分为自定义链表和内置LinkedListLinkedList是双向循环链表,功能强大;
  • 链表的核心是节点和引用,增删灵活但查询效率低,适合频繁增删的场景;
  • 需掌握链表的基本操作(增、删、反转)和经典算法问题,理解指针(引用)的移动逻辑。


例1:

  • 给你单链表的头结点 head ,请你找出并返回链表的中间结点。
  • 如果有两个中间结点,则返回第二个中间结点。
class Solution {public ListNode middleNode(ListNode head) {ListNode cur1 = head;//快指针ListNode cur2 = head;//慢指针while(cur1!=null&&cur1.next!=null){//cur1 = cur1.next.next;cur2 = cur2.next;}return cur2;}
}


例2:

  • 链表的逆置
   //链表的逆置
public ListNode reverseList() {if(head == null||head.next == null) {return head;}ListNode cur = head.next;head.next = null;while(cur != null) {ListNode curN = cur.next;cur.next = head;head = cur;cur = curN;}return head;
}


例3:

  •     获取倒数第 k 个结点的数据
    //获取倒数第 k 个结点的数据public int kthToLast( int k) {if(head == null) return -1;if(k <= 0) {return -1;}ListNode fast = head;ListNode slow = head;int count = 0;while(count != k-1) {fast = fast.next;if(fast == null) {return -1;}count++;}while(fast.next != null) {fast = fast.next;slow = slow.next;}return slow.val;}


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

相关文章:

  • JWT(JSON Web Token)详解
  • 快手KAT-Dev-72B模型开源登顶!国产AI编程助手迎来技术突
  • 网站建设app开发有哪里可以做兼职翻译的网站
  • Web 开发入门:从前端到后端的全栈开发探索
  • Redis-Zest
  • 深圳市升华建设有限公司网站制作网页的
  • 用opencv来识别信用卡的号码 Vs 使用yolo+paddleocr
  • 小程序 地理位置授权怎么搞
  • 福州贸易公司网站制作seo的网站
  • 开网站 主机 服务器百度竞价广告的位置
  • 【Unity每日一记】Unity脚本教程:用脚本创建物体与输入系统详解
  • 动易网站官网使用python建设一个论坛网站
  • Java-集合练习3
  • 2.c++面向对象(六)
  • STM32 环境监测项目笔记(一):DHT11 温湿度传感器原理与驱动实现
  • C++ 完全背包
  • 【Linux】理解链接过程
  • 广州做网站多少钱怎么做简单的网站首页
  • 【机器人学中的状态估计】7.5.2习题证明:(Cu)^=(2cos(phi)+1)u^-u^C-C^Tu^公式证明
  • Flask、Nginx 与 Docker 的分工与协作
  • 怎么建立一个公司的网站吗ui界面设计作品模板
  • 网站浮动广告怎么做qq开放平台网站开发申请不通过的原因
  • redis中的list命令
  • 对网站建设课程的心得体会北京旅游网页设计
  • 碎片化知识整理利器:NoteGen——AI驱动的免费开源笔记工具使用指南
  • 网站的建设方法包括什么问题高端网站建设大概多少费用
  • RabbitMQ Exchange类型与绑定规则详解
  • 太平洋建设官方网站wordpress 显示分类
  • 比特币私钥位数范围动态估计源代码
  • 随机游走:从布朗运动到PageRank算法的数学之旅