java写个双链表
以下是一个简单的双向链表的Java实现:
public class DoublyLinkedList<T> {
private Node<T> head;
private Node<T> tail;
private int size;
private static class Node<T> {
T data;
Node<T> prev;
Node<T> next;
Node(T data) {
this.data = data;
this.prev = null;
this.next = null;
}
}
public DoublyLinkedList() {
head = null;
tail = null;
size = 0;
}
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public void addFirst(T data) {
Node<T> newNode = new Node<>(data);
if (isEmpty()) {
head = newNode;
tail = newNode;
} else {
newNode.next = head;
head.prev = newNode;
head = newNode;
}
size++;
}
public void addLast(T data) {
Node<T> newNode = new Node<>(data);
if (isEmpty()) {
head = newNode;
tail = newNode;
} else {
newNode.prev = tail;
tail.next = newNode;
tail = newNode;
}
size++;
}
public void add(int index, T data) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException();
}
if (index == 0) {
addFirst(data);
} else if (index == size) {
addLast(data);
} else {
Node<T> current = head;
for (int i = 0; i < index - 1; i++) {
current = current.next;
}
Node<T> newNode = new Node<>(data);
newNode.prev = current;
newNode.next = current.next;
current.next.prev = newNode;
current.next = newNode;
size++;
}
}
public T removeFirst() {
if (isEmpty()) {
throw new NoSuchElementException();
}
T data = head.data;
if (size == 1) {
head = null;
tail = null;
} else {
head = head.next;
head.prev = null;
}
size--;
return data;
}
public T removeLast() {
if (isEmpty()) {
throw new NoSuchElementException();
}
T data = tail.data;
if (size == 1) {
head = null;
tail = null;
} else {
tail = tail.prev;
tail.next = null;
}
size--;
return data;
}
public T remove(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
if (index == 0) {
return removeFirst();
} else if (index == size - 1) {
return removeLast();
} else {
Node<T> current = head;
for (int i = 0; i < index; i++) {
current = current.next;
}
T data = current.data;
current.prev.next = current.next;
current.next.prev = current.prev;
size--;
return data;
}
}
public T get(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
Node<T> current = head;
for (int i = 0; i < index; i++) {
current = current.next;
}
return current.data;
}
public void set(int index, T data) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
Node<T> current = head;
for (int i = 0; i < index; i++) {
current = current.next;
}
current.data = data;
}
public boolean contains(T data) {
Node<T> current = head;
while (current != null) {
if (current.data.equals(data)) {
return true;
}
current = current.next;
}
return false;
}
public void clear() {
head = null;
tail = null;
size = 0;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
Node<T> current = head;
while (current != null) {
sb.append(current.data);
if (current.next != null) {
sb.append(", ");
}
current = current.next;
}
sb.append("]");
return sb.toString();
}
}
这个类包含以下方法:
size():返回链表中元素的个数。isEmpty():检查链表是否为空。addFirst(T data):在链表的开头添加一个元素。addLast(T data):在链表的末尾添加一个元素。add(int index, T data):在链表的指定位置添加一个元素。removeFirst():从链表的开头删除一个元素,并返回其值。removeLast():从链表的末尾删除一个元素,并返回其值。remove(int index):从链表的指定位置删除一个元素,并返回其值。get(int index):返回链表中指定位置的元素。set(int index, T data):将链表中指定位置的元素替换为指定的值。contains(T data):检查链表中是否包含指定的元素。clear():清空链表中的所有元素。toString():返回链表的字符串表示形式。
注意,这个类是一个泛型类,可以存储任何类型的对象。在创建对象时,必须指定要存储的对象类型。例如:
DoublyLinkedList<String> list = new DoublyLinkedList<>();
list.addLast("hello");
list.addLast("world");
System.out.println(list); // [hello, world]
原文地址: https://www.cveoy.top/t/topic/9Wz 著作权归作者所有。请勿转载和采集!