public class LinkedList<E> {
private int size;
private Node dummyHead;
private class Node {
private E e;
private Node next;
private Node(E e, Node next) {
this.e = e;
this.next = next;
}
private Node(E e) {
this(e, null);
}
private Node() {
this(null, null);
}
public String toString() {
return e.toString();
}
}
public LinkedList() {
dummyHead = new Node();
size = 0;
}
private void add(int index, E e) {
if (index < 0 || index > size) {
throw new IllegalArgumentException("index too small or too large");
}
Node prev = dummyHead;
for (int i = 0; i < index; i++) {
prev = prev.next;
}
prev.next = new Node(e, prev.next);
size++;
}
private void addFirst(E e) {
add(0, e);
}
private void addLast(E e) {
add(size, e);
}
private E remove(int index) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("index too small or too large");
}
Node prev = dummyHead;
for (int i = 0; i < index; i++) {
prev = prev.next;
}
Node del = prev.next;
prev.next = prev.next.next;
size--;
return del.e;
}
private E removeFirst() {
return remove(0);
}
private E removeLast() {
return remove(size - 1);
}
private E get(int index) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("index too small or too large");
}
Node prev = dummyHead;
for (int i = 0; i < index; i++) {
prev = prev.next;
}
return prev.next.e;
}
private E getFirst() {
return get(0);
}
private E getLast() {
return get(size - 1);
}
private void set(int index, E e) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("index too small or too large");
}
Node prev = dummyHead;
for (int i = 0; i < index; i++) {
prev = prev.next;
}
prev.next.e = e;
}
private boolean contains(E e) {
boolean isExist = false;
for (Node cur = dummyHead.next; cur != null; cur = cur.next) {
if (e.equals(cur.e)) {
isExist = true;
}
}
return isExist;
}
private int getSize() {
return size;
}
private boolean isEmpty() {
return size == 0;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
Node cur = dummyHead.next;
while (cur != null) {
sb.append(cur.e + " > ");
cur = cur.next;
}
sb.append("null");
return sb.toString();
}
public static void main(String[] args) {
LinkedList<Integer> linkedList = new LinkedList<>();
System.out.println("链表是否为空 " + linkedList.isEmpty());
System.out.println("链表大小 " + linkedList.getSize());
linkedList.add(0, 1);
System.out.println(linkedList);
System.out.println("链表是否为空 " + linkedList.isEmpty());
System.out.println("链表大小 " + linkedList.getSize());
linkedList.add(1, 2);
System.out.println(linkedList);
System.out.println("链表是否为空 " + linkedList.isEmpty());
System.out.println("链表大小 " + linkedList.getSize());
System.out.println(linkedList);
linkedList.add(2, 3);
linkedList.addLast(4);
linkedList.addFirst(0);
System.out.println(linkedList);
System.out.println("第二个元素 " + linkedList.get(1));
System.out.println("最后一个元素" + linkedList.getLast());
System.out.println("第一个元素" + linkedList.getFirst());
System.out.println("删除第五个元素 " + linkedList.remove(4));
System.out.println(linkedList);
System.out.println("删除第一个元素 " + linkedList.removeFirst());
System.out.println(linkedList);
System.out.println("删除最后一个元素 " + linkedList.removeLast());
System.out.println(linkedList);
System.out.println("是否包含3 " + linkedList.contains(3));
System.out.println("是否包含2 " +linkedList.contains(2));
linkedList.set(1, 3);
System.out.println(linkedList);
linkedList.set(0, 2);
System.out.println(linkedList);
}
}