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

leetcode707. 设计链表(单链表+虚拟头指针+双指针遍历)

题目:leetcode707. 设计链表

描述:
你可以选择使用单链表或者双链表,设计并实现自己的链表。

单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。

如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。

实现 MyLinkedList 类:

MyLinkedList() 初始化 MyLinkedList 对象。
int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。
void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。
void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。

示例:

输入
[“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);
myLinkedList.addAtTail(3);
myLinkedList.addAtIndex(1, 2); // 链表变为 1->2->3
myLinkedList.get(1); // 返回 2
myLinkedList.deleteAtIndex(1); // 现在,链表变为 1->3
myLinkedList.get(1); // 返回 3

思路:使用单链表+虚拟指针完成

public class ListNode {public int val;public ListNode next;public ListNode(){};public ListNode(int val){ this.val=val;}public ListNode(int val, ListNode next) {this.val = val;this.next = next;}
}public class MyLinkedList {int size; //除去虚拟头结点之后的长度ListNode head;//虚拟头结点public MyLinkedList() {size=0; //初始化链表长度,但是设置虚拟头结点的时候size不会加一head=new ListNode(-1,null); //设置的虚拟头节点}public int get(int index) {//index从0开始,下面的情况非法if(index<0||index>=size)return -1;ListNode cur=head.next;for (int i = 0; i < index; i++) {cur=cur.next;}return cur.val;}public void addAtHead(int val) {addAtIndex(0,val);}public void addAtTail(int val) {addAtIndex(size,val);}public void addAtIndex(int index, int val) {//如果index<0,说明是插在头结点之前,令index=0//如果inde=size,说明要插在末尾//如果index>size,非法返回空if(index>size)return;if(index<0)index=0;//找到要插入的地方的前驱,方便操作(因为是虚拟指针,如果要找到index位置的元素,则使用i<index-1,// 现在是找到这个元素的前驱,则i<index)ListNode pre=head;for (int i = 0; i < index; i++) {pre=pre.next;}ListNode newNode=new ListNode(val);newNode.next=pre.next;pre.next=newNode;size++;}public void deleteAtIndex(int index) {if(index<0||index>size-1)return;//使用双指针进行删除操作ListNode pre=head;ListNode cur=head.next;for(int i=0;i<index;i++){cur=cur.next;pre=pre.next;}pre.next=cur.next;size--;}
}
http://www.lryc.cn/news/118590.html

相关文章:

  • 电脑麦克风没声音?
  • React Native元素旋转一定的角度
  • LeetCode 1749. 任意子数组和的绝对值的最大值
  • 初学HTML:在线简易画板设计。
  • IDEA项目实践——Spring框架简介,以及IOC注解
  • Scala(第一章Scala入门)
  • Linux tcpdump 命令详解
  • 试卷擦除答案的工具,几个步骤轻松搞定
  • vue3部署宝塔后请求接口404以及刷新页面404的问题解决方案
  • java.sql.Date java.util.Date
  • 斗象科技-2023攻防演练必修高危漏洞集合百度网盘下载(2版本)
  • 分布式数据库视角下的存储过程
  • 深度学习常用的激活函数
  • 深度学习之用PyTorch实现逻辑回归
  • 04-4_Qt 5.9 C++开发指南_时间日期与定时器
  • 7个顶级开源数据集来训练自然语言处理(NLP)和文本模型
  • 计算机网络 网络层 边界网关协议BGP
  • GitHub上受欢迎的Android UI Library
  • cpm log2((cpm/10) + 1) nmf 1e6 1e5
  • 竞赛项目 深度学习的视频多目标跟踪实现
  • 如何避免用waveformRecord复制数组
  • RocketMQ 延迟消息
  • Dex文件混淆(一):BlackObfuscator
  • Linux下编译arm 32 出错(/bin/bash: arm-none-linux-gnueabi-gcc: command not found )
  • 最近遇到的两个小问题总结:git问题和node问题
  • Java # Spring(1)
  • SCL更换阿里数据源
  • 【web逆向】全报文加密流量的去加密测试方案
  • Django实现音乐网站 ⑼
  • 【脚踢数据结构】