链表的基本操作
题目描述:
设计链表(力扣链接🔗)

题目分析:
此题目涉及:
- 获取链表第index个节点的数值
- 在链表的最前面插入一个节点
- 在链表的最后面插入一个节点
- 在链表第index个节点前面插入一个节点
- 删除链表的第index个节点
链表操作的两种方式:
- 直接使用原来的链表来进行操作。
- 设置一个虚拟头结点在进行操作。
此处使用虚拟节点来操作:
代码:
// 链表的定义class ListNode {int val;ListNode next;public ListNode() {}public ListNode(int val, ListNode next) {this.val = val;this.next = next;}public ListNode(int val) {this.val = val;}}class MyLinkedList {// size存储链表元素的个数int size = 0;// 虚拟头节点ListNode head;// 初始化链表public MyLinkedList() {size = 0;head = new ListNode(0);}// 返回索引的值public int get(int index) {if (index < 0 || index >= size) {return -1;}ListNode cur = head.next;for (int i = 0; i < index; i++) {cur = cur.next;}return cur.val;}// 在链表最前面插入一个节点public void addAtHead(int val) {addAtIndex(0, val);}// 在链表的最后插入一个节点public void addAtTail(int val) {addAtIndex(size, val);}// 在第 index 个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。// 如果 index 等于链表的长度,则说明是新插入的节点为链表的尾结点// 如果 index 大于链表的长度,则返回空public void addAtIndex(int index, int val) {if (index > size) {return;}if (index < 0) {index = 0;}// 链表的大小加一size++;// 找到添加的前驱节点ListNode pre = head;for (int i = 0; i < index; i++) {pre = pre.next;}ListNode addNode = new ListNode(val);addNode.next = pre.next;pre.next = addNode;}//删除第index个节点public void deleteAtIndex(int index) {if (index < 0 || index >= size) {return;}size--;ListNode pre = head;ListNode cur = head.next;for (int i = 0; i < index; i++) {pre = pre.next;cur = cur.next;}pre.next = cur.next;}}
