链表的基本操作
题目描述:
设计链表(力扣链接🔗)
题目分析:
此题目涉及:
- 获取链表第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;
}
}