package com.wdx4; /** * @author 猛男 * @slogan 致敬大师,致敬未来的你 * @date 2023/6/26 14:34 */ public class ExerciseLinkedList<E> { // 链表节点数量(链表长度) private int size; // 链表节点数据 (头节点) private Node<E> head; /** * 在链表尾部添加节点 * @param element */ public void add(E element) { add(size, element); } /** * 在指定索引处,添加节点 * @param index * @param element */ public void add(int index, E element){ if (index == 0) { // 索引为0,头部插入,指向链表的头节点 head = new Node<>(element, head); } else { Node<E> prev = node(index -1); prev.next = new Node<>(element, prev.next); } size++; } /** * 移除指定索引的节点,并返回删除节点的元素值 * @param index * @return E deleteValue */ public E remove(int index){ Node<E> node = head; if (index == 0) { head = node.next; } else { Node<E> prev = node(index - 1); node = prev.next; prev.next = prev.next.next; } size--; return node.element; } /** * 修改指定索引节点的元素值,返回旧值 * @param index * @param element * @return E oldValue */ public E update(int index, E element){ Node<E> oldNode = node(index); E oldValue = oldNode.element; oldNode.element = element; return oldValue; } /** * 查询指定索引节点的元素值 * @param index * @return E element */ public E get(int index){ return node(index).element; } /** * 判断元素是否是链表的元素,并返回第一个匹配的下标 * @param element * @return int -1为未找到,正常值为正常 */ public int indexOf(E element){ Node<E> node = head; if (element == null) { for (int i = 0; i < size; i++) { if (node.element == null){ return i; } } } for (int i = 0; i < size; i++) { if (element.equals(node(i).element)){ return i; } } return -1; } /** * 返回索引为index节点的数据 * @param index * @return Node<E> */ public Node<E> node(int index) { rangCheck(index); Node<E> node = head; for (int i = 0; i < index; i++) { node = node.next; } return node; } /** * 判断索引的合法性 * @param index */ private void rangCheck(int index) { if (index < 0 || index >= size) throw new IndexOutOfBoundsException("index:" + index + "size:" + size ); } /** * 清空链表,head置为null之后,剩下的节点会由 JVM GC回收 */ public void clear() { size = 0; head = null; } public int size() { return size; } public boolean isEmpty() { return size == 0; } /** * 打印链表 * @return */ @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("size = ").append(size).append(", ["); Node<E> node = head; for (int i = 0; i < size; i ++) { if (i != 0) { sb.append(", "); } sb.append(node.element); node = node.next; } sb.append("]"); return sb.toString(); } /** * 静态内部类 实例化一次,不用每次调用生成新的对象 * @param <E> */ private static class Node<E>{ E element; Node<E> next; public Node(E element, Node<E> next){ this.element = element; this.next = next; } } }
12-09
384
07-07
614
08-24
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交