707. 设计链表

设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。

在链表类中实现这些功能:

get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。

示例:

MyLinkedList linkedList = new MyLinkedList();
linkedList.addAtHead(1);
linkedList.addAtTail(3);
linkedList.addAtIndex(1,2);   //链表变为1-> 2-> 3
linkedList.get(1);            //返回2
linkedList.deleteAtIndex(1);  //现在链表是1-> 3
linkedList.get(1);            //返回3

提示:

所有val值都在 [1, 1000] 之内。
操作次数将在 [1, 1000] 之内。
请不要使用内置的 LinkedList 库。

class MyLinkedList {private class ListNode {int val;ListNode prev;ListNode next;ListNode(int x) {val = x;}}private ListNode head;private ListNode tail;int size; public MyLinkedList() {head = new ListNode(0);tail = new ListNode(0);head.next = tail;tail.prev = head;}public int get(int index) {if (index >= size || index < 0) return -1;ListNode curr = head;if (index * 2 < size - 1) {for (int i = 0; i <= index; i++) curr = curr.next;} else {curr = tail;for (int i = 0; i < size - index; i++) curr = curr.prev;}return curr.val;}public void addAtHead(int val) {ListNode node = new ListNode(val);ListNode next = head.next;node.next = next;node.prev = head;next.prev = node;head.next = node;size++;}public void addAtTail(int val) {ListNode node = new ListNode(val);ListNode prev = tail.prev;node.next = tail;node.prev = prev;prev.next = node;tail.prev = node;size++;}public void addAtIndex(int index, int val) {if (index > size || index < 0) return;ListNode prev, curr;if (index * 2 < size) {prev = head;for(int i = 0; i < index; i++) prev = prev.next;curr = prev.next;} else {curr = tail;for (int i = 0; i < size - index; i++) curr = curr.prev;prev = curr.prev;}ListNode node = new ListNode(val);node.prev = prev;node.next = curr;prev.next = node;curr.prev = node;++size;}public void deleteAtIndex(int index) {if (index >= size || index < 0) return;ListNode prev, next;if (index * 2 < size) {prev = head;for(int i = 0; i < index; i++) prev = prev.next;next = prev.next.next;} else {next = tail;for (int i = 0; i < size - index - 1; i++) next = next.prev;prev = next.prev.prev;}prev.next = next;next.prev = prev;size--;}
}/*** Your MyLinkedList object will be instantiated and called as such:* MyLinkedList obj = new MyLinkedList();* int param_1 = obj.get(index);* obj.addAtHead(val);* obj.addAtTail(val);* obj.addAtIndex(index,val);* obj.deleteAtIndex(index);*/

Java实现 LeetCode 707 设计链表(环形链表)相关推荐

  1. 数据结构-链表-环形链表

    数据结构-链表-环形链表 环形链表就是将单链表的尾部指向头部,从而形成一个单方向的环形结构,环形链表中每个元素都可以是head,也都可以是尾部,这样就不用担心链表头指针遗失的问题,而且在遍历链表的时候 ...

  2. LeetCode 707. 设计链表(List)

    文章目录 1. 设计一个单链表 2. 双向链表 1. 设计一个单链表 在链表类中实现这些功能: get(index):获取链表中第 index 个节点的值.如果索引无效,则返回-1. addAtHea ...

  3. 【LeetCode笔记】142. 环形链表 II(Java、快慢指针)

    文章目录 题目描述 思路 & 代码 更新版 三刷 - 再更新 题目描述 相对于环形链表,这里要求找到环的起点 难点在于 O(1),否则可以直接哈希表冲 思路 & 代码 找出快慢指针的路 ...

  4. <力扣(LeetCode)>141、环形链表(链表基础解法)java

    141. 环形链表 给你一个链表的头节点 head ,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,评测系统内部使用整 ...

  5. java模拟单链表环形链表解决约瑟夫问题

    java模拟环形链表解决约瑟夫问题 此文是观看尚硅谷韩老师的数据结构与算法学习视频整理的笔记 约瑟夫问题描述 约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算 ...

  6. 【LeetCode】详解环形链表141. Linked List Cycle Given a linked list, determine if it has a cycle in it. To

    文章目录 前言 正文 原题: 思路1: 思路2 思路3 总结 前言 今天这道题目的第一种解法很奇葩,用计时器竟然可以AC,并且可以自己调整时间多少,跟我一起来看看吧. 正文 原题: 链接:环形链表 G ...

  7. LeetCode-环形链表|+环形链表||

    环形链表 | 和 || 题型相似且 || 是 | 的升级版,故放一起. 1.题 | 如下: 2.题目分析: 返回的是一个布尔型的结果,如果有环返回true,无环返回false. 3.源代码: bool ...

  8. 环形链表环形链表 II

    文章目录 前言 1.141. 环形链表 证明为什么快指针一定为2步,慢指针一定为1步 1.当循环链表前的距离与循环链表后的距离相等时 2.当循环链表前的距离为循环链表后的距离的1/2 同种情况下,fa ...

  9. leetcode 707 设计链表

    设计链表的实现.您可以选择使用单链表或双链表.单链表中的节点应该具有两个属性:val 和 next.val 是当前节点的值,next 是指向下一个节点的指针/引用.如果要使用双向链表,则还需要一个属性 ...

  10. Leetcode 707.设计链表

    传送门:力扣 答案在文后/ 在链表类中实现这些功能: get(index):获取链表中第 index 个节点的值.如果索引无效,则返回-1. addAtHead(val):在链表的第一个元素之前添加一 ...

最新文章

  1. SAP MM 物料主数据的Document Data
  2. [java]The String Pool
  3. ANSYS Products 19.1 安装教程
  4. iphone定时关机_成都苹果维修点教你iPhone手机死机、关不了机怎么处理?
  5. 【算法】梯度消失与梯度爆炸
  6. GDCM: 简单的QIDO-RS往返测试gdcm :: JSON的实现
  7. python传文件给java_python使用简单http协议来传送文件
  8. 项目日报模板_第一届全国技能大赛现场直击:混凝土建筑项目全场最“高”
  9. java 逻辑或 作用_Java开发中与之间的区别,你真的知道吗?
  10. linux中python编译器的配置_方舟编译器环境配置及源码编译过程详解
  11. 老李分享知识:性能测试之TPS和吞吐率
  12. js substring和substr的区别实例,一目了然
  13. octave c++函数中调用fortran77子程序
  14. Docker最全教程之使用Tencent Hub来完成CI(九)
  15. [转]Intent跳转到系统应用中的拨号界面、联系人界面、短信界面及其他
  16. ADS仿真4_滤波器设计
  17. SSIS数据转换器及字符转换器使用
  18. 经典:5种常见的数据分析方法
  19. 互联网的寒冬是否只是以讹传讹?
  20. 蚂蚁金服java研发面经_蚂蚁金服Java研发岗实习内推面经

热门文章

  1. android 高仿网易,Android项目实战教程之高仿网易云音乐启动页实例代码
  2. word当前页面设置第一页
  3. 字符个数统计 java
  4. mysql begin end 定界符_mysql存储过程BEGIN END复合语句用法示例
  5. 2019国人工资报告:月薪过万是个槛?大部分网友表示月薪不足5K!
  6. SpringMVC文件上传和Jwt身份验证
  7. 黄山学院计算机专业考研情况,为什么考入北大的研究生偏偏来自黄山学院这样的学校?...
  8. 超频到3200最佳时序_ddr4内存时序多少为好
  9. 巴特沃斯(Butterworth)滤波器(一)
  10. python滤波器处理数据的优点_使用Python对原始信号应用合适的butterworth滤波器