LinkedList源码学习
核心:递归、链表结构
public class LinkedListTemplate<E> {
public int size;//大小
public Node linknode;//节点
public static void main(String[] args) {
/* LinkedListTemplate<String> demo = new LinkedListTemplate<>();
demo.add(0,"22");## 标题
demo.addLast("33");
System.out.println(demo.toString());
demo.addFirst("11");
System.out.println(demo.toString());
demo.add(3,"44");
demo.add(2,"55");
System.out.println(demo.toString());
demo.update(2,"55");
System.out.println(demo.toString());
demo.delete("55");
System.out.println(demo.toString());
demo.delete(4);
System.out.println(demo.toString());
demo.delete("55");
System.out.println(demo.toString());*/
Thread thread1 = new Thread(()->{
LinkedListTemplate<String> list1 = new LinkedListTemplate<>();
LinkedListTemplate<String> list2 = new LinkedListTemplate<>();
int i = 0;
while(i<10){
list1.addFirst("aaaaa0"+i);
list2.addFirst("bbbbb0"+i);
i++;
}
System.out.println(list1.toString());
System.out.println(list2.toString());
});
Thread thread2 = new Thread(()->{
LinkedListTemplate<String> list3 = new LinkedListTemplate<>();
LinkedListTemplate<String> list4 = new LinkedListTemplate<>();
int i = 0;
while(i<10){
list3.addFirst("aaaaa0"+i);
list4.addFirst("aaaaa0"+i);
i++;
}
System.out.println(list3.toString());
System.out.println(list4.toString());
});
thread1.start();
thread2.start();
}
//初始化
public LinkedListTemplate(){
this.size = 0;
this.linknode = new Node();
}
//主要方法:新增
public /*synchronized*/ void add(int index,E e){
if(index < 0 || index > size){
throw new IllegalArgumentException("add Error");
}
Node prev = linknode;
for(int i = 0;i <index; i++){
prev = prev.next;
}
prev.next = new Node(e,prev.next);//获取当前节点下的下一个节点,并给下一个节点赋值
size++;
}
//头部添加
public /*synchronized */void addFirst(E e){
add(0,e);
}
//尾部添加
public void addLast(E e){
add(size,e);
}
//修改元素
public void update(int index,E e){
if(index <0 || index > size)
throw new IllegalArgumentException("update error");
Node pre = linknode;
for(int i = 0;i < index ;i++)
{
pre = pre.next;
}
pre.e = e;//修改当前节点中的元素
}
//删除节点1:按照元素删除
public void delete(E e){
Node cur = linknode;
while(cur != null){
if(cur.next.e.equals(e)){
break;
}
cur = cur.next;
}
Node delNode = cur.next;
cur.next = delNode.next;
delNode.next = null;
size --;
}
//删除节点2:按照下标删除
public void delete(int index){
if(index < 0 || index > size)
throw new IllegalArgumentException(" delete error");
Node del = linknode;
while(index < size){
del = linknode.next;
}
Node delNode = del.next;
del.next = delNode.next;//保存当前的下一个节点
delNode.next = null;
size --;
}
//判断是否有该元素
public boolean contains(E e){
boolean flag = false;
Node del = linknode.next;
while (del.e != null){
if(e.equals(del.e)){
flag = true;
}
del = del.next;//遍历当前元素的下一个元素
}
return flag;
}
//tostring
@Override
public String toString(){
StringBuffer buffer = new StringBuffer();
buffer.append(String.format("LinkedDemo size:%d\n", size));
buffer.append("head:");
Node cur = linknode.next;
while(cur != null){
buffer.append(cur+" -> ");
cur = cur.next;
}
buffer.append("NULL");
return buffer.toString();
}
//node内部类
private class Node{
private E e = null;
private Node next =null;
public Node(){}
public Node(E e){
this.e = e;
}
public Node(E e,Node next){
this.e = e;
this.next = next;
}
@Override
public String toString(){
return e.toString(
);
}
}
}