门户网站开发上海网站建设 网页做

张小明 2026/1/19 20:42:52
门户网站开发,上海网站建设 网页做,seo排名点击 seo查询,南昌做网站价格设计链表 问题描述 设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性#xff1a;val 和 next。val 是当前节点的值#xff0c;next 是指向下一个节点的指针/引用。 如果是双向链表#xff0c;则还需要一个属性 prev 以指示链表中的上一个节点…设计链表问题描述设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性val和next。val是当前节点的值next是指向下一个节点的指针/引用。如果是双向链表则还需要一个属性prev以指示链表中的上一个节点。实现MyLinkedList类int get(int index)获取链表中第index个节点的值。如果索引无效则返回-1。void addAtHead(int val)在链表的第一个元素之前添加一个值为val的节点。插入后新节点将成为链表的第一个节点。void addAtTail(int val)将值为val的节点追加到链表的最后一个元素。void addAtIndex(int index, int val)在链表中的第index个节点之前添加值为val的节点。如果index等于链表的长度则该节点将附加到链表的末尾。如果index大于链表长度则不会插入节点。如果index小于 0则在头部插入节点。void deleteAtIndex(int index)如果索引index有效则删除链表中的第index个节点。注意所有val值都在[1, 1000]范围内。操作次数不会超过2000次。请不要使用内置的 LinkedList 库。示例输入: [MyLinkedList, addAtHead, addAtTail, addAtIndex, get, deleteAtIndex, get] [[], [1], [3], [1,2], [1], [1], [1]] 输出: [null, null, null, null, 2, null, 3] 解释: MyLinkedList myLinkedList new MyLinkedList(); myLinkedList.addAtHead(1); // 链表: 1 myLinkedList.addAtTail(3); // 链表: 1-3 myLinkedList.addAtIndex(1,2); // 链表: 1-2-3 myLinkedList.get(1); // 返回 2 myLinkedList.deleteAtIndex(1); // 链表: 1-3 myLinkedList.get(1); // 返回 3算法思路虚拟头节点哨兵节点使用虚拟头节点简化边界处理避免对空链表的特殊处理所有操作都可以统一处理长度维护维护链表长度避免每次遍历计算用于快速验证索引有效性操作get(index)遍历到第index个节点addAtHead(val)在虚拟头节点后插入addAtTail(val)遍历到尾节点后插入addAtIndex(index, val)在第index个位置前插入deleteAtIndex(index)删除第index个节点代码实现方法一单链表 虚拟头节点classMyLinkedList{// 链表节点定义privatestaticclassListNode{intval;ListNodenext;ListNode(intval){this.valval;this.nextnull;}}privateListNodedummyHead;// 虚拟头节点privateintsize;// 链表长度/** * 初始化链表 */publicMyLinkedList(){dummyHeadnewListNode(-1);// 虚拟头节点值不重要size0;}/** * 获取链表中第index个节点的值 * * param index 节点索引 (0-based) * return 节点值如果索引无效返回-1 */publicintget(intindex){// 检查索引有效性if(index0||indexsize){return-1;}// 从虚拟头节点开始移动index1步到达目标节点ListNodecurrentdummyHead;for(inti0;iindex;i){currentcurrent.next;}returncurrent.val;}/** * 在链表头部添加节点 * * param val 要添加的节点值 */publicvoidaddAtHead(intval){addAtIndex(0,val);}/** * 在链表尾部添加节点 * * param val 要添加的节点值 */publicvoidaddAtTail(intval){addAtIndex(size,val);}/** * 在指定索引位置添加节点 * * param index 插入位置的索引 * param val 要添加的节点值 */publicvoidaddAtIndex(intindex,intval){// 如果index大于链表长度不插入if(indexsize){return;}// 如果index小于0在头部插入if(index0){index0;}// 找到插入位置的前一个节点ListNodeprevdummyHead;for(inti0;iindex;i){prevprev.next;}// 创建新节点并插入ListNodenewNodenewListNode(val);newNode.nextprev.next;prev.nextnewNode;size;}/** * 删除指定索引位置的节点 * * param index 要删除的节点索引 */publicvoiddeleteAtIndex(intindex){// 检查索引有效性if(index0||indexsize){return;}// 找到要删除节点的前一个节点ListNodeprevdummyHead;for(inti0;iindex;i){prevprev.next;}// 删除节点prev.nextprev.next.next;size--;}}方法二双链表classMyLinkedList{privatestaticclassListNode{intval;ListNodenext;ListNodeprev;ListNode(intval){this.valval;}}privateListNodehead;// 虚拟头节点privateListNodetail;// 虚拟尾节点privateintsize;publicMyLinkedList(){headnewListNode(-1);tailnewListNode(-1);head.nexttail;tail.prevhead;size0;}publicintget(intindex){if(index0||indexsize){return-1;}ListNodecurrent;// 从较近的一端开始遍历if(indexsize/2){currenthead.next;for(inti0;iindex;i){currentcurrent.next;}}else{currenttail.prev;for(inti0;isize-1-index;i){currentcurrent.prev;}}returncurrent.val;}publicvoidaddAtHead(intval){addAtIndex(0,val);}publicvoidaddAtTail(intval){addAtIndex(size,val);}publicvoidaddAtIndex(intindex,intval){if(indexsize){return;}if(index0){index0;}ListNodeprev;if(indexsize/2){prevhead;for(inti0;iindex;i){prevprev.next;}}else{prevtail.prev;for(inti0;isize-index;i){prevprev.prev;}}ListNodenewNodenewListNode(val);ListNodenextprev.next;prev.nextnewNode;newNode.prevprev;newNode.nextnext;next.prevnewNode;size;}publicvoiddeleteAtIndex(intindex){if(index0||indexsize){return;}ListNodecurrent;if(indexsize/2){currenthead.next;for(inti0;iindex;i){currentcurrent.next;}}else{currenttail.prev;for(inti0;isize-1-index;i){currentcurrent.prev;}}current.prev.nextcurrent.next;current.next.prevcurrent.prev;size--;}}算法分析时间复杂度get(index)O(index)最坏O(n)addAtHead(val)O(1)addAtTail(val)O(n)单链表O(1)双链表addAtIndex(index, val)O(index)最坏O(n)deleteAtIndex(index)O(index)最坏O(n)空间复杂度O(n)n为链表长度算法过程初始化dummyHead → nullsize 0addAtHead(1)在dummyHead后插入1dummyHead → 1 → nullsize 1addAtTail(3)在尾部插入3dummyHead → 1 → 3 → nullsize 2addAtIndex(1, 2)在索引1位置插入2找到索引0的节点值为1插入2dummyHead → 1 → 2 → 3 → nullsize 3get(1)返回索引1的值2deleteAtIndex(1)删除索引1的节点dummyHead → 1 → 3 → nullsize 2get(1)返回索引1的值3测试用例publicclassTestMyLinkedList{publicstaticvoidmain(String[]args){// 测试用例1标准示例MyLinkedListmyLinkedList1newMyLinkedList();myLinkedList1.addAtHead(1);// [1]myLinkedList1.addAtTail(3);// [1,3]myLinkedList1.addAtIndex(1,2);// [1,2,3]System.out.println(get(1): myLinkedList1.get(1));// 2myLinkedList1.deleteAtIndex(1);// [1,3]System.out.println(get(1): myLinkedList1.get(1));// 3System.out.println();// 测试用例2边界索引MyLinkedListmyLinkedList2newMyLinkedList();System.out.println(get(0): myLinkedList2.get(0));// -1 (空链表)myLinkedList2.addAtHead(1);System.out.println(get(0): myLinkedList2.get(0));// 1System.out.println(get(1): myLinkedList2.get(1));// -1 (越界)myLinkedList2.deleteAtIndex(0);// 删除唯一元素System.out.println(get(0): myLinkedList2.get(0));// -1System.out.println();// 测试用例3addAtIndex边界情况MyLinkedListmyLinkedList3newMyLinkedList();myLinkedList3.addAtIndex(0,1);// 等同于addAtHeadmyLinkedList3.addAtIndex(1,2);// 等同于addAtTailmyLinkedList3.addAtIndex(1,3);// 在中间插入// 链表: [1,3,2]System.out.println(get(0): myLinkedList3.get(0));// 1System.out.println(get(1): myLinkedList3.get(1));// 3System.out.println(get(2): myLinkedList3.get(2));// 2// 测试用例4重复操作MyLinkedListmyLinkedList5newMyLinkedList();myLinkedList5.addAtHead(1);myLinkedList5.addAtHead(1);// 允许重复值myLinkedList5.addAtTail(1);// 链表: [1,1,1]System.out.println(get(0): myLinkedList5.get(0));// 1System.out.println(get(1): myLinkedList5.get(1));// 1System.out.println(get(2): myLinkedList5.get(2));// 1myLinkedList5.deleteAtIndex(1);// 删除中间的1// 链表: [1,1]System.out.println(get(0): myLinkedList5.get(0));// 1System.out.println(get(1): myLinkedList5.get(1));// 1}}关键点虚拟头节点统一处理空链表和非空链表的情况避免对head的特殊处理简化插入和删除操作的代码索引有效性get和deleteAtIndex索引范围[0, size-1]addAtIndex索引范围(-∞, size]超出范围不插入复用addAtHead和addAtTail可以复用addAtIndex减少代码重复提高可维护性边界情况处理空链表的操作单节点链表的删除越界索引常见问题为什么使用虚拟头节点避免对空链表的特殊处理所有插入操作都可以统一为在某节点后插入删除操作总是有前驱节点无需特殊处理头节点addAtIndex的索引规则index 0在头部插入index size在尾部插入index size不插入0 index size在指定位置插入
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做网站不赚钱素材网视频

你是不是也这样:下载的PDF堆满文件夹,想找的时候死活记不住名字;读文献时灵感一闪,回头却找不到记在哪了;写论文时,调整一个引用格式就要折腾半小时…文献管理不是小事,它直接决定了你的研究效率…

张小明 2026/1/17 17:02:37 网站建设

登陆注册是静态网站海拉尔网站建设

摘要:该代码实现了一个模板函数reversed_binary_value,它将布尔参数包以逆序方式转换为二进制数值。通过递归模板结构ReversedBinaryValueHelper计算二进制值,其中每个位乘2的幂次相加。测试部分使用CheckValues模板递归生成6位二进制组合&am…

张小明 2026/1/17 17:02:37 网站建设

360建网站好不好?公司网站怎么选

OpenFlex Board Viewer:开源电路板文件查看器终极指南 【免费下载链接】OpenBoardView View .brd files 项目地址: https://gitcode.com/gh_mirrors/op/OpenBoardView 在电子设计与维修领域,面对不同格式的电路板文件常常成为工程师的噩梦。当你收…

张小明 2026/1/17 17:02:39 网站建设

什么软件可以自主建设网站沂南网站建设

服务器存储管理与备份全解析 1. 卷的扩展与收缩 1.1 扩展卷 动态卷的扩展十分便捷,可利用同一物理驱动器的可用空间,也能使用服务器上其他物理驱动器的空间。扩展卷的步骤如下: 1. 右键单击要扩展的卷,选择“扩展卷”,“扩展卷向导”将出现,点击“下一步”继续。 2.…

张小明 2026/1/17 17:02:41 网站建设

中文静态网站下载wordpress访问很慢吗

PaddlePaddle虚拟试衣间技术:图像生成与分割的深度融合 在电商直播和在线购物日益普及的今天,用户对“所见即所得”的体验要求越来越高。尤其在服装类目中,因尺码不合、版型偏差或色差导致的退货率长期居高不下——据行业统计,部…

张小明 2026/1/17 17:02:41 网站建设