如题,要完整的代码,包含最基本的链表是否为空,链表长度,在头或尾部添加元素,在头部移除元素(尾部不要求)
/**
单链表实现
@author caasi
@since 2021-07-28 16:58:20
/
public class SinglyLinkedList implements Cloneable{
/**
/**
节点内部类
@param
/
private class Node{
private E element;
private Node next;
public Node(E e, Node n){
element = e;
next = n;
}
public E getElement(){
return element;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
//头节点
private Node head;
//尾节点
private Node tail;
//链表长度
private int size;
public int size(){
return size;
}
public boolean isEmpty(){
return size == 0;
}
public E first(){
if(isEmpty()) return null;
return head.getElement();
}
public E last(){
if(isEmpty()) return null;
return tail.getElement();
}
public E removeFirst(){
if(isEmpty()) return null;
E e = head.getElement();
head = head.getNext();
size -- ;
if(isEmpty()) tail = null;
return e;
}
public void addFirst(E e){
head = new Node<>(e, head);
if(isEmpty()) tail = head;
size ++;
}
public void addLast(E e){
Node<E> newNode = new Node<>(e, null);
if(isEmpty()){
head = newNode;
} else {
tail.setNext(newNode);
}
size ++;
tail = newNode;
}
public void add(E e){
addLast(e);
}
public void print(){
if(isEmpty()) return;
Node<E> node = head;
while(node != null){
System.out.println(node.getElement());
node = node.getNext();
}
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if(getClass() != obj.getClass()) return false;
SinglyLinkedList o = (SinglyLinkedList) obj;
if(size != o.size) return false;
Node walkA = head;
Node walkB = o.head;
while (walkA != null){
if(!walkA.getElement().equals(walkB.getElement())){
return false;
}
walkA = walkA.getNext();
walkB = walkB.getNext();
}
return true;
}
@Override
protected Object clone() throws CloneNotSupportedException {
SinglyLinkedList other = (SinglyLinkedList) super.clone();
if (size > 0){
other.head = new Node<E>(head.getElement(), null);
Node<E> walk = head.getNext();
Node<E> otherTail = other.head;
while (walk != null){
Node<E> newest = new Node<>(walk.getElement(), null);
otherTail.setNext(newest);
otherTail = newest;
walk = walk.getNext();
}
}
return other;
}
}
链表是最基本的数据结构,例如以head为头节点,他不存放任何的数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,而每个节点中都有一个next引用,指向下一个节点,就这样一节一节往下面记录,直到最后一个节点,其中的next指向null。