链表的查询操作事件复杂度为O(n),更新、插入、删除的事件复杂度(不考虑之前查询)为O(1)。下面以单链表为例
public class MyLinkedList {
//链表中的头结点
private Node head;
//尾结点
private Node last;
//链表中元素个数
private int size;
private static class Node {
private int data;
private Node next;
public Node(int data) {
this.data = data;
}
}
public static void main(String[] args) {
//链表初始化
MyLinkedList myLinkedList = new MyLinkedList();
myLinkedList.insert(1, 0);
myLinkedList.insert(2, 1);
myLinkedList.insert(3, 2);
myLinkedList.insert(4, 3);
myLinkedList.print();
//插入元素
myLinkedList.insert(6, 0);
myLinkedList.print();
myLinkedList.insert(7, 1);
myLinkedList.print();
myLinkedList.insert(8, myLinkedList.size);
myLinkedList.print();
//移除元素
myLinkedList.remove(1);
myLinkedList.print();
myLinkedList.remove(0);
myLinkedList.print();
myLinkedList.remove(myLinkedList.size - 1);
myLinkedList.print();
//查询元素
System.out.println(myLinkedList.get(3).data);
//更新元素
myLinkedList.update(9, 3);
System.out.println(myLinkedList.get(3).data);
}
public void insert(int element, int index) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("超出链表实际元素范围");
}
Node newNode = new Node(element);
if (head == null) {
head = last = newNode;
} else if (index == 0) {
//头部插入
newNode.next = head;
head = newNode;
} else if (index == size) {
//尾部插入
last.next = newNode;
last = newNode;
} else {
//中间插入
Node preNode = get(index - 1);
newNode.next = preNode.next;
preNode.next = newNode;
}
size++;
}
public Node remove(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("超出链表实际元素范围");
}
Node deleteElement = get(index);
if (index == 0) {
//头部删除
head = head.next;
} else if (index == size - 1) {
//尾部删除
Node node = get(index - 1);
node.next = null;
last = node;
} else {
//中间删除
Node node = get(index - 1);
Node nextNode = node.next.next;
node.next = nextNode;
}
size--;
return deleteElement;
}
public Node get(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("超出链表实际元素范围");
}
Node node = head;
//这里从0开始遍历,也可以根据索引值决定从头部遍历还是从尾部遍历
for (int i = 0; i < index; i++) {
node = node.next;
}
return node;
}
public void update(int element, int index) {
Node node = get(index);
node.data = element;
}
public void print() {
Node node = head;
while (node != null) {
System.out.print(node.data + " ");
node = node.next;
}
System.out.println();
}
}
链表初始化:1 2 3 4
头部插入元素:6 1 2 3 4
中间插入元素:6 7 1 2 3 4
尾部插入元素:6 7 1 2 3 4 8
中间删除元素:6 1 2 3 4 8
头部删除元素:1 2 3 4 8
尾部删除元素:1 2 3 4
查询索引为3的值:4
更新索引为3的值并查询:9