自己手写LinkedList时,发现处理节点有些时候思维有点重复,后面调试的时候才发现有些代码重复了。
1.链表结构
likendList底层就是有一个Node对象,node对象中有三个要素:见代码
添加有两种方式,无非就是改变节点前后对应的节点,删除也是一样,核心思想在于如何操作节点。
import lombok.Data;
@Data
public class ExtLinkedList<E> {
private Node first;//第一个节点
private Node last;//最后一个节点
private volatile int size=0;
public void add(E e){
Node node = new Node();
node.object=e;
if(first==null){
//如果第一个节点为空
first=node;
}else{
//新节点的前一个是last
node.prev=last;
//最后一个节点的下一个是新节点
last.next=node;
}
//新的节点变成最后一个
last=node;
//长度加一
size++;
}
public void add(Integer index,E e){
checkElementIndex(index);
//先找到index上的节点
Node node=getNode(index);
//新建节点
Node newNode=new Node();
//得到原来节点的上一个节点
Node prev=node.prev;
newNode.object=e;
//如果老节点的上一个节点为空
if(prev==null){
newNode=first;
}else{
//老节点的下一个节点是新节点
prev.next=newNode;
//新节点的下一个节点是老节点
newNode.next=node;
//长度加1
size++;
}
}
public Node getNode(Integer index){
checkElementIndex(index);
Node node=null;
if(first!=null){
node=first;
}
for (int i=0;i<index;i++) {
node=node.next;
}
return node;
}
public E get(Integer index){
checkElementIndex(index);
ExtLinkedList<E>.Node node=getNode(index);
return (E)node.object;
}
public void remove(Integer index){
checkElementIndex(index);
//找到这个元素
Node node =getNode(index);
if(node!=null){
//得到前一个Node
Node prev=node.prev;
//得到下一个节点
Node next=node.next;
if(prev!=null) {
prev.next = next;
}
if(next!=null) {
next.prev = prev;
}
}
size--;
}
class Node{
Node prev;//前一个节点
Object object;//业务数据
Node next;//下一个节点
}
private boolean isElementIndex(int index) {
return index >= 0 && index < size;
}
private void checkElementIndex(int index) {
if (!isElementIndex(index))
throw new IndexOutOfBoundsException("下标越界");
}
public static void main(String[] args) {
ExtLinkedList<String> extLinkedList=new ExtLinkedList<>();
extLinkedList.add("111");
extLinkedList.add("222");
for (int i = 0; i < extLinkedList.size; i++) {
System.out.println(extLinkedList.get(i));
}
extLinkedList.remove(0);
for (int i = 0; i < extLinkedList.size; i++) {
System.out.println(extLinkedList.get(i));
}
}
}