设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:valnextval 是当前节点的值,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 库。

作者:LeetCode

链接:https://leetcode-cn.com/problems/design-linked-list/solution/she-ji-lian-biao-by-leetcode/

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

单链表

  • 哨兵节点:

哨兵节点在树和链表中被广泛用作伪头、伪尾等,通常不保存任何数据。

我们将使用伪头来简化我们简化插入和删除。

  1. class ListNode {
  2. int val;
  3. ListNode next;
  4. ListNode() {
  5. }
  6. /**
  7. * @param val
  8. */
  9. ListNode(int val) {
  10. this.val = val;
  11. }
  12. /**
  13. * @param val
  14. * @param next
  15. */
  16. ListNode(int val, ListNode next) {
  17. this.val = val;
  18. this.next = next;
  19. }
  20. }
  21. /**
  22. * MyLinkedList
  23. */
  24. class MyLinkedList {
  25. int size;
  26. ListNode head; //虚节点
  27. public MyLinkedList() {
  28. size = 0;
  29. head = new ListNode(0);
  30. }
  31. /**
  32. * @param index
  33. * @return
  34. */
  35. public int get(int index) {
  36. if (index < 0 || index >= size) {
  37. return -1;
  38. }
  39. ListNode cur = head;
  40. for (int i = 0; i < index + 1; i++) {
  41. cur = cur.next;
  42. }
  43. return cur.val;
  44. }
  45. /**
  46. * @param val
  47. */
  48. public void addAtHead(int val) {
  49. addAtIndex(0, val);
  50. }
  51. /**
  52. * @param val
  53. */
  54. public void addAtTail(int val) {
  55. addAtIndex(size, val);
  56. }
  57. /**
  58. * @param index
  59. * @param val
  60. */
  61. public void addAtIndex(int index, int val) {
  62. if (index > size) return;
  63. if (index < 0) index = 0;
  64. size++;
  65. ListNode pre = head;
  66. for (int i = 0; i < index; i++) {
  67. pre = pre.next;
  68. }
  69. ListNode add = new ListNode(val);
  70. add.next = pre.next;
  71. pre.next = add;
  72. }
  73. /**
  74. * @param index
  75. */
  76. public void deleteAtIndex(int index) {
  77. if (index < 0 || index >= size) return;
  78. size--;
  79. ListNode pre = head;
  80. for (int i = 0; i < index; i++) {
  81. pre = pre.next;
  82. }
  83. pre.next = pre.next.next;
  84. }
  85. }
  86. public class LC707 {
  87. public static void main(String[] args) {
  88. MyLinkedList linkedList = new MyLinkedList();
  89. linkedList.addAtHead(1);
  90. linkedList.addAtTail(3);
  91. linkedList.addAtIndex(1, 2); //链表变为1-> 2-> 3
  92. System.out.println(linkedList.get(1)); //返回2
  93. linkedList.deleteAtIndex(1); //现在链表是1-> 3
  94. System.out.println(linkedList.get(1)); //返回3
  95. }
  96. }

Python实现

  1. class ListNode:
  2. def __init__(self, x):
  3. self.val = x
  4. self.next = None
  5. class MyLinkedList:
  6. def __init__(self):
  7. self.size = 0
  8. self.head = ListNode(0)
  9. def get(self, index: int) -> int:
  10. if index < 0 or index >= self.size:
  11. return -1
  12. curr = self.head
  13. for _ in range(index + 1):
  14. curr = curr.next
  15. return curr.val
  16. def addAtHead(self, val: int) -> None:
  17. self.addAtIndex(0, val)
  18. def addAtTail(self, val: int) -> None:
  19. self.addAtIndex(self.size, val)
  20. def addAtIndex(self, index: int, val: int) -> None:
  21. if index > self.size:
  22. return
  23. if index < 0:
  24. index = 0
  25. self.size = self.size + 1
  26. pred = self.head
  27. for _ in range(index):
  28. pred = pred.next
  29. add = ListNode(val)
  30. add.next = pred.next
  31. pred.next = add
  32. def deleteAtIndex(self, index: int) -> None:
  33. if index > self.size:
  34. return
  35. self.size -= 1
  36. pred = self.head
  37. for _ in range(index):
  38. pred = pred.next
  39. pred.next = pred.next.next

LC-707的更多相关文章

  1. 四种比较简单的图像显著性区域特征提取方法原理及实现-----> AC/HC/LC/FT。

    laviewpbt  2014.8.4 编辑 Email:laviewpbt@sina.com   QQ:33184777 最近闲来蛋痛,看了一些显著性检测的文章,只是简单的看看,并没有深入的研究,以 ...

  2. “LC.exe”错误

    错误“LC.exe”已退出,代码为 -1. 可能的原因是: 这个第三方组件是个商业组件,他在组件的主使用类定义了 LicenseProvider(typeof(LicFileLicenseProvid ...

  3. 1Z0-053 争议题目解析707

    1Z0-053 争议题目解析707 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 707.Because of a logical corruption in the EMPLOY ...

  4. 解决VS下“LC.exe已退出,代码为-1”问题

    今天使用VS2015开发一个Winform程序,手一抖拖错了一个第三方控件,然后将其去掉并删除相关的引用,结果导致了LC.exe错误:"Lc.exe已退出,代码为-1 ". 经过上 ...

  5. 解析.NET 许可证编译器 (Lc.exe) 的原理与源代码剖析

    许可证编译器 (Lc.exe) 的作用是读取包含授权信息的文本文件,并产生一个可作为资源嵌入到公用语言运行库可执行文件中的 .licenses 文件. 在使用第三方类库时,经常会看到它自带的演示程序中 ...

  6. Lc.exe已退出,代码为-1

    编译项目,出现提示"Lc.exe已退出,代码为-1" .   解决办法: 意思就是把licenses.licx这个文件里的内容删除,但是文件还在(此时是个空文件),发生这个问题的原 ...

  7. "LC.exe" exited with code -1 错误

    当打开一个VS程序时出现"LC.exe" exited with code -1错误,解决方法是: 删除licenses.licx文件即可

  8. LC.exe exited with code -1

    昨天从win8.1升级到win10之后, 一切还算顺利, 就是升级时间比较长. 但是快下班的时候 遇到一个问题, 是之前在win8.1上没遇到的, 首先代码win8.1 vs2013 上跑的时候一切正 ...

  9. vs2012编译出错“LC.exe”已退出解决方法

    “LC.exe”已退出,代码为 -1. 解决方法: 将项目Properties下的licenses.licx文件删除,重新编译即可.

  10. Codeforces 707 E. Garlands (二维树状数组)

    题目链接:http://codeforces.com/problemset/problem/707/E 给你nxm的网格,有k条链,每条链上有len个节点,每个节点有一个值. 有q个操作,操作ask问 ...

随机推荐

  1. webug4.0 打靶笔记-02【完结】

    webug4.0打靶笔记-02 3. 延时注入(时间盲注) 3.1 访问靶场 3.2 寻找注入点 貌似一样的注入点: ?id=1' --+ 3.3 判断输出位置 同前两关一样的位置,时间盲注应该不是这 ...

  2. jdbc创建数据库的连接

    package com.gylhaut.db; import java.sql.Connection;import java.sql.DriverManager;import java.sql.Res ...

  3. 记一次解决关机蓝屏 | MULTIPLE_IRP_COMPLETE_REQUESTS | klflt.sys

    已经解决蓝屏问题,原因是卡巴斯基安全软件驱动导致,需要卸载卡巴斯基安全软件,详细过程如下. 一.关机时蓝屏 Win10系统,在关机动画快结束时突然蓝屏,提示:你的设备遇到问题,需要重启,终止代码:MU ...

  4. Spring AOP Xml配置过程及解释

    目录 Spring AOP(基于xml) 专业术语: 基于xml的声明式AspectJ 具体实践 Spring AOP(基于xml) 目前主流的AOP框架有两个,分别是Spring AOP和Aspec ...

  5. Android 12(S) 图形显示系统 - BufferQueue的工作流程(十一)

    题外话 我竟然已经写了这个系列的十一篇文章了,虽然内容很浅显,虽然内容很枯燥,虽然内容也许没营养,但我为自己的坚持点赞! 一.前言 前面的两篇文章,分别讲解了Producer的处理逻辑和queue b ...

  6. Linux-Centos7学习笔记

    镜像下载.域名解析.时间同步请点击阿里云开源镜像站 下载.安装与配置 下载 下载Centos镜像,网站见参考 点击大的版本,例如7,再选择isos进行下载 安装 这里使用的VMware 12 Pro, ...

  7. [SPDK/NVMe存储技术分析]008 - RDMA概述

    毫无疑问地,用来取代iSCSI/iSER(iSCSI Extensions for RDMA)技术的NVMe over Fabrics着实让RDMA又火了一把.在介绍NVMe over Fabrics ...

  8. Jinkins流水线脚本使用curl命令调用服务接口,并且使用url传参。

    curl http://xxx.xx.xx.xx:xxxx/jenkins/publish?fileName=${fileName}&tag_name=${tag_name} 如图调用不符合c ...

  9. spring-boot-learning-RabbitMQ

    为什么需要MQ??? 异步处理: 场景: 用户注册后,需要发注册邮件和注册短信,传统的做法有两种 1.串行的方式 2.并行的方式` 用户注册-发送注册邮箱-发送注册短信都完成之后才结束返回给客户端 邮 ...

  10. MariaDB 存储引擎一览(官方文档翻译)

    inline-translate.translate { } inline-translate.translate::before, inline-translate.translate::after ...