用java编写自定义集合,实现使用双向链表进行添加、删除、查询、修改元素
时间: 2024-01-27 15:06:17 浏览: 22
好的,以下是一个简单的双向链表实现的自定义集合,包括添加、删除、查询、修改元素的方法:
```java
public class MyLinkedList<E> {
private Node<E> head;
private Node<E> tail;
private int size;
public MyLinkedList() {
head = null;
tail = null;
size = 0;
}
public void add(E element) {
Node<E> newNode = new Node<>(element);
if (size == 0) {
head = newNode;
tail = newNode;
} else {
tail.next = newNode;
newNode.prev = tail;
tail = newNode;
}
size++;
}
public void remove(E element) {
Node<E> node = head;
while (node != null) {
if (node.data.equals(element)) {
if (node.prev != null) {
node.prev.next = node.next;
} else {
head = node.next;
}
if (node.next != null) {
node.next.prev = node.prev;
} else {
tail = node.prev;
}
size--;
return;
}
node = node.next;
}
}
public E get(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
Node<E> node = head;
for (int i = 0; i < index; i++) {
node = node.next;
}
return node.data;
}
public void set(int index, E element) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
Node<E> node = head;
for (int i = 0; i < index; i++) {
node = node.next;
}
node.data = element;
}
public int size() {
return size;
}
private static class Node<E> {
E data;
Node<E> prev;
Node<E> next;
Node(E element) {
data = element;
prev = null;
next = null;
}
}
}
```
说明:
1. `MyLinkedList` 类实现了一个简单的泛型双向链表,数据类型为 `E`。
2. `head` 和 `tail` 分别表示链表的头和尾节点,`size` 表示链表的大小。
3. `add` 方法可以在链表尾部添加元素,如果链表为空则将新节点作为头节点。
4. `remove` 方法可以删除指定元素,如果元素不存在则什么也不做。
5. `get` 方法可以获取指定下标的元素,如果下标越界则抛出 `IndexOutOfBoundsException` 异常。
6. `set` 方法可以修改指定下标的元素,如果下标越界则抛出 `IndexOutOfBoundsException` 异常。
7. `size` 方法可以获取链表的大小。
使用示例:
```java
MyLinkedList<String> list = new MyLinkedList<>();
list.add("hello");
list.add("world");
list.add("java");
System.out.println(list.get(1)); // 输出 "world"
list.set(2, "python");
list.remove("hello");
System.out.println(list.size()); // 输出 "2"
```