链表的基本操作

题目描述:

设计链表(力扣链接🔗

链表的基本操作 - 图1

题目分析:

此题目涉及:

  • 获取链表第index个节点的数值
  • 在链表的最前面插入一个节点
  • 在链表的最后面插入一个节点
  • 在链表第index个节点前面插入一个节点
  • 删除链表的第index个节点

链表操作的两种方式:

  1. 直接使用原来的链表来进行操作。
  2. 设置一个虚拟头结点在进行操作。

此处使用虚拟节点来操作:

代码:

  1. // 链表的定义
  2. class ListNode {
  3. int val;
  4. ListNode next;
  5. public ListNode() {
  6. }
  7. public ListNode(int val, ListNode next) {
  8. this.val = val;
  9. this.next = next;
  10. }
  11. public ListNode(int val) {
  12. this.val = val;
  13. }
  14. }
  15. class MyLinkedList {
  16. // size存储链表元素的个数
  17. int size = 0;
  18. // 虚拟头节点
  19. ListNode head;
  20. // 初始化链表
  21. public MyLinkedList() {
  22. size = 0;
  23. head = new ListNode(0);
  24. }
  25. // 返回索引的值
  26. public int get(int index) {
  27. if (index < 0 || index >= size) {
  28. return -1;
  29. }
  30. ListNode cur = head.next;
  31. for (int i = 0; i < index; i++) {
  32. cur = cur.next;
  33. }
  34. return cur.val;
  35. }
  36. // 在链表最前面插入一个节点
  37. public void addAtHead(int val) {
  38. addAtIndex(0, val);
  39. }
  40. // 在链表的最后插入一个节点
  41. public void addAtTail(int val) {
  42. addAtIndex(size, val);
  43. }
  44. // 在第 index 个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。
  45. // 如果 index 等于链表的长度,则说明是新插入的节点为链表的尾结点
  46. // 如果 index 大于链表的长度,则返回空
  47. public void addAtIndex(int index, int val) {
  48. if (index > size) {
  49. return;
  50. }
  51. if (index < 0) {
  52. index = 0;
  53. }
  54. // 链表的大小加一
  55. size++;
  56. // 找到添加的前驱节点
  57. ListNode pre = head;
  58. for (int i = 0; i < index; i++) {
  59. pre = pre.next;
  60. }
  61. ListNode addNode = new ListNode(val);
  62. addNode.next = pre.next;
  63. pre.next = addNode;
  64. }
  65. //删除第index个节点
  66. public void deleteAtIndex(int index) {
  67. if (index < 0 || index >= size) {
  68. return;
  69. }
  70. size--;
  71. ListNode pre = head;
  72. ListNode cur = head.next;
  73. for (int i = 0; i < index; i++) {
  74. pre = pre.next;
  75. cur = cur.next;
  76. }
  77. pre.next = cur.next;
  78. }
  79. }