介绍:通过单链表实现LinkList
对外接口:
源码:
package algorithmBeauty.dataStructure.link.iLinkList;
/**
* @author : HuXuehao
* @date : 2021年4月11日下午10:12:27
* @version :
*/
@SuppressWarnings("unused")
public class MyLinkList<E> {
private int size = 0;
private Node<E> head;
private Node<E> foot;
public MyLinkList() {
head = new Node<>(null, null);
}
/**
* @Description 返回list的规模
*/
public int size() {
return size;
}
/**
* @Description 清空list
*/
public void clear() {
head.next = null;
size = 0;
}
/**
* @Description 判断list是否为null
*/
public boolean isEmpty() {
return size == 0;
}
/**
* @Description 判断element是否包含在list中
*/
public boolean contain(E elemnet) {
resetFoot();
for (int i = 0; i < size; i++) {
if(foot.next.element == elemnet) return true;
foot = foot.next;
}
return false;
}
/**
* @Description 向list中添加element
*/
public void add(E element) {
resetFoot();
while(foot.next!=null) {
foot = foot.next;
}
foot.next = new Node<>(element, null);
size++;
}
/**
* @Description 向list的index处添加element
*/
public void add(int index, E element) {
if(index != size) indexIsLegal(index);
resetFoot();
for (int i = 0; i < index; i++) {
foot = foot.next;
}
foot.next = new Node<>(element, foot.next);
size++;
}
/**
* @Description 获取list中index处的element
*/
public E getElement(int index ) {
indexIsLegal(index);
resetFoot();
for (int i = 0; i < index; i++) {
foot = foot.next;
}
return foot.next.element;
}
/**
* @Description 将list中index处的element设置为新的element
*/
public E setElement(int index, E element) {
indexIsLegal(index);
resetFoot();
for (int i = 0; i < index; i++) {
foot = foot.next;
}
E oldElement = foot.next.element;
foot.next.element = element;
return oldElement;
}
/**
* @Description 删除list中index处的元素
*/
public E remove(int index) {
indexIsLegal(index);
resetFoot();
for (int i = 0; i < index; i++) {
foot = foot.next;
}
E removeElement = foot.next.element;
foot.next = foot.next.next;
size--;
return removeElement;
}
/**
* @Description 获取list中第一个出现的element的index
*/
public int indexOf(E element) {
resetFoot();
for (int i = 0; i < size; i++) {
if(foot.next.element == element) return i;
foot = foot.next;
}
return -1;
}
/**
* @Description 打印list
*/
public String toString() {
resetFoot();
StringBuilder str = new StringBuilder();
str.append("[");
for (int i = 0; i < size; i++) {
if(i != size-1) {
str.append(foot.next.element + ", ");
}else {
str.append(foot.next.element);
}
foot = foot.next;
}
str.append("]");
return str.toString();
}
/**
* @Description 重置foot指针
*/
private void resetFoot() {
foot = head;
}
/**
* @Description 检验index是否合法
*/
private void indexIsLegal(int index) {
if(index < 0 && index >=size) {
throw new IndexOutOfBoundsException("index can not be "+index);
}
}
/**
* @Description Node节点
*/
@SuppressWarnings("hiding")
private class Node<E> {
E element;
Node<E> next;
public Node(E element,Node<E> next) {
this.element = element;
this.next = next;
}
}
}
测试代码:
class A{
String name;
int age;
public A(String name,int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "A [name=" + name + ", age=" + age + "]";
}
}
public class Main {
public static void main(String[] args) {
MyLinkList<A> list1 = new MyLinkList<>();
list1.add(new A("虾米",5));
list1.add(new A("鲤鱼",10));
list1.add(new A("乌龟",55));
System.out.println(list1.toString());
System.out.println("-------------------------------------------");
MyLinkList<Integer> list = new MyLinkList<>();
list.add(1);
list.add(3);
list.add(4);
list.add(5);
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
System.out.println(list.toString());
list.add(3);
list.add(4);
list.add(5);
System.out.println(list.toString());
list.add(1, 6);
list.add(0, 7);
list.add(list.size(),8);
System.out.println(list.toString());
list.setElement(0, 0);
list.setElement(5, -10);
list.setElement(list.size()-1, 100);
System.out.println(list.toString());
if(list.contain(10)) System.out.println("ok");
else System.out.println("not found");
list.remove(0);
System.out.println(list.toString());
list.remove(list.size()-1);
System.out.println(list.toString());
list.remove(3);
System.out.println(list.toString());
System.out.println("element=6的index是:"+list.indexOf(6));
System.out.println("element=1的index是:"+list.indexOf(1));
System.out.println("element=5的index是:"+list.indexOf(5));
list.remove(0);
System.out.println(list.toString());
list.remove(2);
System.out.println(list.toString());
list.remove(list.size()-1);
System.out.println(list.toString());
if(list.isEmpty()) System.out.println("arraylist is null");
else System.out.println("arraylist is not null");
list.clear();
if(list.isEmpty()) System.out.println("arraylist is null");
else System.out.println("arraylist is not null");
System.out.println(list.toString());
}
}
测试结果: