题目地址(707. 设计链表)

https://leetcode-cn.com/problems/design-linked-list/

题目描述

  1. 设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val nextval 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。
  2. 在链表类中实现这些功能:
  3. get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1
  4. addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
  5. addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
  6. addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
  7. deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
  8. 示例:
  9. MyLinkedList linkedList = new MyLinkedList();
  10. linkedList.addAtHead(1);
  11. linkedList.addAtTail(3);
  12. linkedList.addAtIndex(1,2); //链表变为1-> 2-> 3
  13. linkedList.get(1); //返回2
  14. linkedList.deleteAtIndex(1); //现在链表是1-> 3
  15. linkedList.get(1); //返回3
  16. 提示:
  17. 所有val值都在 [1, 1000] 之内。
  18. 操作次数将在 [1, 1000] 之内。
  19. 请不要使用内置的 LinkedList 库。

前置知识


公司

  • 暂无

思路

使用虚拟头结点 其他的都在代码里了

关键点


代码

  • 语言支持:Java

Java Code:

  1. class MyLinkedList {
  2. int size;
  3. ListNode head;
  4. public MyLinkedList() {
  5. size = 0;
  6. head = new ListNode(0);
  7. }
  8. public int get(int index) {
  9. //判断index是否非法
  10. if (index < 0 || index >= size) {
  11. return -1;
  12. }
  13. //定义虚拟头结点
  14. ListNode currentNode = head;
  15. for (int i = 0; i <=index; i++) {
  16. currentNode = currentNode.next;
  17. }
  18. return currentNode.val;
  19. }
  20. public void addAtHead(int val) {
  21. addAtIndex(0, val);
  22. }
  23. public void addAtTail(int val) {
  24. addAtIndex(size, val);
  25. }
  26. public void addAtIndex(int index, int val) {
  27. //如果index大于数组长度 返回空
  28. if (index > size){
  29. return;
  30. }
  31. //如果小于0 就加在数组最前面
  32. if (index < 0) {
  33. index = 0;
  34. }
  35. //将数组长度增加
  36. size++;
  37. //定义虚拟头结点
  38. ListNode pre = head;
  39. for (int i = 0; i < index; i++) {
  40. pre = pre.next;
  41. }
  42. //定义一个添加的节点
  43. ListNode addNode = new ListNode(val);
  44. //这里注意顺序
  45. addNode.next = pre.next;
  46. pre.next = addNode;
  47. }
  48. public void deleteAtIndex(int index) {
  49. if (index >= size ||index < 0) {
  50. return;
  51. }
  52. size--;
  53. ListNode delNode = head;
  54. for (int i = 0; i < index; i++) {
  55. delNode = delNode.next;
  56. }
  57. delNode.next = delNode.next.next;
  58. }
  59. }
  60. /**
  61. * Your MyLinkedList object will be instantiated and called as such:
  62. * MyLinkedList obj = new MyLinkedList();
  63. * int param_1 = obj.get(index);
  64. * obj.addAtHead(val);
  65. * obj.addAtTail(val);
  66. * obj.addAtIndex(index,val);
  67. * obj.deleteAtIndex(index);
  68. */

复杂度分析

令 n 为数组长度。

  • 时间复杂度:707. 设计链表 - 图1#card=math&code=O%28n%29&id=bAa7P)
  • 空间复杂度:707. 设计链表 - 图2#card=math&code=O%28n%29&id=VwUYL)