最近在复习Java数据结构与算法的知识,这里编写代码简单实现链表。
欢迎批评指正!
package com.zhangyu.study.test20191112;
/**
* Function: 手写链表实践
*
* @author zhangyu
* Date: 2019/11/12
* @since JDK 1.8
*/
public class MyLinkedList<T> {
/**
* 内部类,节点类
*/
private class Node {
private Node(T data) {
this.data = data;
}
/**
* 数据
*/
private T data;
/**
* 下一个节点
*/
private Node next;
}
/**
* 头节点
*/
private Node head ;
/**
* 尾结点 方便遍历
*/
private Node last;
/**
* 容量
*/
private int size;
/**
* 根据索引获取数据
* @param index 索引
* @return 数据
*/
public Node get(int index) {
if (index <0 || index >= size) {
throw new IndexOutOfBoundsException("索引超出界限!");
}
Node tmp = head;
for (int i = 0; i < index; i++) {
tmp = tmp.next;
}
return tmp;
}
/**
* 在指定位置插入数据
* @param index 索引
* @param data 数据
* @return 插入的数据
*/
public T insert(Integer index, T data) {
if (index <0 || index > size) {
throw new IndexOutOfBoundsException("索引超出界限!");
}
Node insertNode = new Node(data);
if (size == 0) {
head = insertNode;
last = insertNode;
} else if (index == 0) {
insertNode.next = head;
head = insertNode;
} else if (index == size) {
last.next = insertNode;
last = insertNode;
} else {
Node current = get(index-1);
insertNode.next = current.next;
current.next = insertNode;
}
size ++ ;
return data;
}
/**
* 输出结果
*/
public void print() {
if (size == 0) {
System.out.println("None");
} else {
Node tmp = head;
do{
System.out.println(tmp.data);
tmp = tmp.next;
} while (tmp != null);
}
}
/**
* 移除链表中的元素
* @param index 索引
* @return 移除的元素
*/
public T remove(int index) {
Node remove = get(index);
if (index == 0) {
head = remove.next;
} else if (index == size - 1){
last = get(index -1);
last.next = null;
} else {
Node pre = get(index - 1);
pre.next = remove.next;
}
size --;
return remove.data;
}
public static void main(String[] args) {
MyLinkedList<Integer> myLinkedList = new MyLinkedList<>();
myLinkedList.insert(0,2);
myLinkedList.insert(1,4);
myLinkedList.insert(1,6);
myLinkedList.insert(3,8);
myLinkedList.insert(4,2);
myLinkedList.insert(5,0);
myLinkedList.print();
System.out.println("===============");
myLinkedList.remove(0);
myLinkedList.print();
System.out.println("==============");
myLinkedList.remove(myLinkedList.size - 1);
myLinkedList.print();
System.out.println("==============");
myLinkedList.remove(2);
myLinkedList.print();
System.out.println("==============");
}
}