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 个节点。

示例:

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

提示:

所有val值都在 [1, 1000] 之内。

操作次数将在 [1, 1000] 之内。

请不要使用内置的 LinkedList 库。

  1. class MyLinkedList {
  2. private class ListNode {
  3. int val;
  4. ListNode prev;
  5. ListNode next;
  6. ListNode(int x) {val = x;}
  7. }
  8. private ListNode head;
  9. private ListNode tail;
  10. int size;
  11. public MyLinkedList() {
  12. head = new ListNode(0);
  13. tail = new ListNode(0);
  14. head.next = tail;
  15. tail.prev = head;
  16. }
  17. public int get(int index) {
  18. if (index >= size || index < 0) return -1;
  19. ListNode curr = head;
  20. if (index * 2 < size - 1) {
  21. for (int i = 0; i <= index; i++) curr = curr.next;
  22. } else {
  23. curr = tail;
  24. for (int i = 0; i < size - index; i++) curr = curr.prev;
  25. }
  26. return curr.val;
  27. }
  28. public void addAtHead(int val) {
  29. ListNode node = new ListNode(val);
  30. ListNode next = head.next;
  31. node.next = next;
  32. node.prev = head;
  33. next.prev = node;
  34. head.next = node;
  35. size++;
  36. }
  37. public void addAtTail(int val) {
  38. ListNode node = new ListNode(val);
  39. ListNode prev = tail.prev;
  40. node.next = tail;
  41. node.prev = prev;
  42. prev.next = node;
  43. tail.prev = node;
  44. size++;
  45. }
  46. public void addAtIndex(int index, int val) {
  47. if (index > size || index < 0) return;
  48. ListNode prev, curr;
  49. if (index * 2 < size) {
  50. prev = head;
  51. for(int i = 0; i < index; i++) prev = prev.next;
  52. curr = prev.next;
  53. } else {
  54. curr = tail;
  55. for (int i = 0; i < size - index; i++) curr = curr.prev;
  56. prev = curr.prev;
  57. }
  58. ListNode node = new ListNode(val);
  59. node.prev = prev;
  60. node.next = curr;
  61. prev.next = node;
  62. curr.prev = node;
  63. ++size;
  64. }
  65. public void deleteAtIndex(int index) {
  66. if (index >= size || index < 0) return;
  67. ListNode prev, next;
  68. if (index * 2 < size) {
  69. prev = head;
  70. for(int i = 0; i < index; i++) prev = prev.next;
  71. next = prev.next.next;
  72. } else {
  73. next = tail;
  74. for (int i = 0; i < size - index - 1; i++) next = next.prev;
  75. prev = next.prev.prev;
  76. }
  77. prev.next = next;
  78. next.prev = prev;
  79. size--;
  80. }
  81. }
  82. /**
  83. * Your MyLinkedList object will be instantiated and called as such:
  84. * MyLinkedList obj = new MyLinkedList();
  85. * int param_1 = obj.get(index);
  86. * obj.addAtHead(val);
  87. * obj.addAtTail(val);
  88. * obj.addAtIndex(index,val);
  89. * obj.deleteAtIndex(index);
  90. */

Java实现 LeetCode 707 设计链表(环形链表)的更多相关文章

  1. 【LeetCode题解】141_环形链表

    目录 141_环形链表 描述 解法一:哈希表 思路 Java 实现 Python 实现 解法二:双指针(龟兔算法) 思路 Java 实现 Python 实现 141_环形链表 描述 给定一个链表,判断 ...

  2. LeetCode 141、142环形链表

    141题: 首先,先看141题,这个题是比较初级也是比较经典的环形链表题: 给定一个链表,判断链表中是否有环. 进阶:你能否不使用额外空间解决此题? 那么,什么是有环的链表呢: 这个就是有环的链表 题 ...

  3. C# 数据结构 - 单链表 双链表 环形链表

    链表特点(单链表 双链表) 优点:插入和删除非常快.因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一 ...

  4. LeetCode——707 设计链表

    题目: 总而言之就是要用C++手撸链表,我的代码: class MyLinkedList { public: /** Initialize your data structure here. */ M ...

  5. LeetCode | 707. 设计链表

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

  6. LeetCode 707 ——设计链表

    1. 题目 2. 解答 用一个单链表来实现,只有一个头指针.因为不能建立哨兵结点,因此要特别注意是否在头结点处操作. class MyLinkedList { public: struct ListN ...

  7. Java实现 LeetCode 706 设计哈希映射(数组+链表)

    706. 设计哈希映射 不使用任何内建的哈希表库设计一个哈希映射 具体地说,你的设计应该包含以下的功能 put(key, value):向哈希映射中插入(键,值)的数值对.如果键对应的值已经存在,更新 ...

  8. 【LeetCode题解】142_环形链表2(Linked-List-Cycle-II)

    目录 描述 解法一:哈希表 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针 思路 Java 实现 Python 实现 复杂度分析 描述 给定一个链表,返回链表开始入环的第一个节点 ...

  9. Java实现 LeetCode 24 两两交换链表中的节点

    24. 两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3-&g ...

随机推荐

  1. Day_12【集合】扩展案例4_判断字符串每一个字符出现的次数

    分析以下需求,并用代码实现 1.利用键盘录入,输入一个字符串 2.统计该字符串中各个字符的数量(提示:字符不用排序) 3.如: 用户输入字符串 "If~you-want~to~change- ...

  2. Git使用教程之在github上创建项目(三)

    继续~ 登录你的github账号,创建一个新项目 1. 2. 至此,github的项目也创建完成了.

  3. HttpPoolUtils 连接池管理的GET POST请求

    package com.nextjoy.projects.usercenter.util.http; import org.apache.http.Consts; import org.apache. ...

  4. OpenCv 学习安装(一)

    1.opencv版本:opencv-3.4.2-vc14_vc15.exe2.设置环境变量path: E:\opencv\opencv\build\x64\vc14\bin3.用VS2015新建一个w ...

  5. 初识JAVA(学习记录)

    Java 1.1Java简介 Java是一种跨平台的,面向对象的程序设计语言.无论是电脑还是手机,到处都运行着JAVA开发的应用程序:JAVA程序可以在任何计算机.操作系统以及支持JAVA的硬件设备上 ...

  6. PART(Persistent Adaptive Radix Tree)的Java实现源码剖析

    论文地址 Adaptive Radix Tree: https://db.in.tum.de/~leis/papers/ART.pdf Persistent Adaptive Radix Tree: ...

  7. mysql小白系列_07 锁与事务

    1.MySQL参数autocommit生产环境设1还是0?为什么? 2.MySQL参数tx_isolation生产环境上大多数是设什么值,为什么? 3.与MySQL锁相关的有哪些因素? 1.MySQL ...

  8. 矩阵重叠面积计算 线段树hdu1542

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  9. excel2007灵活计算2个日期之间的工作日

    C1单元格公式:=NETWORKDAYS(A1,B1,$F$2:$F$10)+COUNTIFS($I$2:$I$3,">="&A1,$I$2:$I$3,"& ...

  10. GitHub 热点速览 Vol.21:Go 新手起手式,学就完事儿了

    作者:HelloGitHub-小鱼干 摘要:说到学习之道,方法很重要,好的学习方法能让你比他人更快地入门到精通,比如本周被 3k 多人 pick 的 learngo 项目,它收录了多个例子和练习,新手 ...