LinkedList 要求:包括add、get、size、indexOf、remove方法的代码实现.并在每个功能前注释其实现逻辑
时间: 2023-07-10 08:16:50 浏览: 46
好的,我会为您提供 LinkedList 的代码实现,并注释每个方法的实现逻辑,如下所示:
```java
public class LinkedList<E> {
private Node<E> head; // 头结点
private int size; // 链表长度
// 节点内部类
private static class Node<E> {
E item; // 存储元素
Node<E> next; // 指向下一个节点
public Node(E item, Node<E> next) {
this.item = item;
this.next = next;
}
}
/**
* 向链表末尾添加元素
*
* @param e 待添加的元素
* @return true(添加成功)
*/
public boolean add(E e) {
addLast(e);
return true;
}
/**
* 获取链表中指定下标的元素
*
* @param index 下标
* @return 下标对应的元素
* @throws IndexOutOfBoundsException 如果下标越界
*/
public E get(int index) {
checkElementIndex(index);
Node<E> node = head;
for (int i = 0; i < index; i++) {
node = node.next;
}
return node.item;
}
/**
* 获取链表长度
*
* @return 链表长度
*/
public int size() {
return size;
}
/**
* 获取链表中指定元素的下标
*
* @param o 待查找的元素
* @return 元素在链表中的下标,如果不存在返回-1
*/
public int indexOf(Object o) {
int index = 0;
if (o == null) {
for (Node<E> node = head; node != null; node = node.next) {
if (node.item == null) {
return index;
}
index++;
}
} else {
for (Node<E> node = head; node != null; node = node.next) {
if (o.equals(node.item)) {
return index;
}
index++;
}
}
return -1;
}
/**
* 移除链表中指定元素
*
* @param o 待移除的元素
* @return true(移除成功)
*/
public boolean remove(Object o) {
if (o == null) {
for (Node<E> node = head; node != null; node = node.next) {
if (node.item == null) {
unlink(node);
return true;
}
}
} else {
for (Node<E> node = head; node != null; node = node.next) {
if (o.equals(node.item)) {
unlink(node);
return true;
}
}
}
return false;
}
/**
* 在链表末尾添加元素
*
* @param e 待添加的元素
*/
private void addLast(E e) {
Node<E> newNode = new Node<>(e, null);
if (head == null) {
head = newNode;
} else {
Node<E> node = head;
while (node.next != null) {
node = node.next;
}
node.next = newNode;
}
size++;
}
/**
* 检查下标是否越界
*
* @param index 下标
* @throws IndexOutOfBoundsException 如果下标越界
*/
private void checkElementIndex(int index) {
if (!isElementIndex(index)) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
}
/**
* 判断下标是否在链表范围内
*
* @param index 下标
* @return true(在范围内)
*/
private boolean isElementIndex(int index) {
return index >= 0 && index < size;
}
/**
* 移除指定节点
*
* @param node 待删除的节点
*/
private void unlink(Node<E> node) {
if (node == head) {
head = head.next;
} else {
Node<E> prev = head;
while (prev.next != node) {
prev = prev.next;
}
prev.next = node.next;
}
size--;
}
}
```
希望能够解决您的问题。