https://blog.csdn.net/qq_40301026/article/details/86773133
参照其底层代码,按照自己的理解实现了LinkedList的一些基本功能。
如果对c和c++指针了解一下,理解起来非常快。
package cn.liu.MyLinkedList;
//结点
public class Node {
Node prevoius;//上一个节点
Node next;//下一个节点
Object element;//数据
//一个全参构造器
public Node(Node prevoius, Node next, Object element) {
super();
this.prevoius = prevoius;
this.next = next;
this.element = element;
}
//构造器,来传数据
public Node(Object element) {
super();
this.element = element;
}
}
package cn.liu.MyLinkedList;
/**
* 自定义一个链表
* @author Dick
*
*/
public class MyLinkedList<E> {
//链表的头和尾,没有实例化
private Node first;
private Node last;
private int size;//链表的长度
//add函数,每一个加在链表尾
public void add(E obj) {
Node node = new Node(obj);//把数据已经装到此结点里
if(first==null)
{
//链表为空的话,它的前面和后面指向都为空
node.prevoius = null;
node.next = null;
//它是链表的第一个也是最后一个元素
first = node;
last = node;
}
else
{
//本结点的前驱和后驱处理
node.prevoius = last;
node.next = null;
//上一个结点指向本结点, 然后设置node为链表最后一个结点
last.next = node;
last = node;
}
size++;
}
//add函数,在指定位置插入一个结点
//先通过index找到位置,再插入
public void add(E obj,int index) {
Node newnode = new Node(obj);//新建一个结点
Node temp = getnode(index);//找到指定结点
if(index == 0)//第一个结点
{
first.prevoius = newnode;
newnode.next = first;
newnode.prevoius = null;
first = newnode;
}
else //其他结点
{
//newnode前面结点的操作
temp.prevoius.next = newnode;
newnode.prevoius = temp.prevoius;
//newnode后面结点的操作
temp.prevoius = newnode;
newnode.next = temp;
}
size--;
}
//判断索引是不是合法
public void judge(int index) {
if(index < 0 ||index>size-1)
{
throw new RuntimeException("索引数字不合法:"+index);
}
}
//找到某个节点
public Node getnode(int index) {
judge(index);
Node temp = null;
if(index<=(size>>1))//从前面查找
{
temp = first;
for(int i=0;i<index;i++)
{
temp = temp.next;
}
}
else//从后面查找
{
temp = last;
for(int j = size-1 ;j>index;j--) {
temp = temp.prevoius;
}
}
return temp;
}
//get函数
public Object get(int index) {
judge(index);
return getnode(index).element;
}
//toString函数重写
@Override
public String toString() {
StringBuilder sb = new StringBuilder("[");
Node temp = first;
while(temp!=null){
sb.append(temp.element+",");
temp = temp.next;
}
sb.setCharAt(sb.length()-1, ']');
return sb.toString();
}
//remove函数 移除指定结点
public void remove(int index) {
judge(index);
Node temp = getnode(index);
if(temp!=null)
{
Node one = temp.prevoius;//temp前一个节点
Node two = temp.next;//temp后一个结点
//被删除结点为首结点
if(index==0)
{
two.prevoius = null;
first = two;
}
//被删除结点为尾结点
if(index == size-1)
{
one.next = null;
last = one ;
}
//被删除结点为中间的结点
if(one!=null)
{
one.next = two;
}
if(two!=null)
{
two.prevoius = one;
}
size--;
}
}
}