Java-链表结构
链表结构(火车和火车车厢):
1):单向链表:只能从头遍历到尾/只能从尾遍历到头.
2):双向链表:既可以从头遍历到尾,又可以从尾遍历到头.
-------------------------------------
通过引用来表示上一个节点和下一个节点的关系.
package com._520it.linked;
//基于双向链表集合
public class MyLinkedList {
protected Node first;// 链表的第一个节点
protected Node last;// 链表的最后一个节点
private int size;// 节点的数量
// 链表中的每一个节点
public class Node {
public Node(Object ele) { // Node的构造器
this.ele = ele;
}
Node prev;// 上一个节点对象
Node next;// 下一个节点对象
public Object ele; // 当前节点中存储的数据
}
public void addFirst(Object ele) {
Node node = new Node(ele);// 需要保存的节点对象
if (size == 0) {
this.first = node;
this.last = node;
} else {
node.next = this.first;// 把之前第一个作为新增节点的下一个节点
this.first.prev = node;// 把新增节点作为之前第一个节点的上一个节点
this.first = node;// 把新增的节点作为第一个节点
}
size++;
}
public void addLast(Object ele) {
Node node = new Node(ele);// 需要保存的节点对象
if (size == 0) {
this.first = node;
this.last = node;
} else {
this.last.next = node;// 新增节点作为之前最后一个节点的下一个节点
node.prev = this.last;// 之前最后一个节点作为新增节点的上一个节点
this.last = node;// 把新增的节点作为最后一个节点
}
size++;
}
public void remove(Object ele) {
// 找到被删除的节点
Node current = this.first;// 确定为第一个节点,从头到尾开始找
for (int i = 0; i < size; i++) {
if (!current.ele.equals(ele)) {// 当前为true !true 为false ,说明找到当前ele,输出
if (current.next == null) { // 续上: 如果false取反为true, 判断是否最后一个,
return;
}
current = current.next;
}
}
//删除节点
if(current==first){
this.first = current.next; //当前的下一个作为第一个
this.first.prev = null; //当前下一个对上一个的引用设置为null
}else if(current==last){
this.last = current.prev;
this.last.next = null;
}else{
//把删除当前节点的下一个节点作为删除节点的上一个节点的next
current.prev.next =current.next;
//把删除节点的上一个节点作为删除节点下一个节点的prev
current.next.prev = current.prev;
}
size--;
//System.out.println("current =" + current.ele);
}
public String toString() {
if (size == 0) {
return "[]";
}
StringBuilder sb = new StringBuilder(size * 2 + 1);
Node current = this.first;// 第一个节点
sb.append("[");
for (int i = 0; i < size; i++) {
sb.append(current.ele);
if (i != size - 1) {
sb.append(",");
} else {
sb.append("]");
}
current = current.next; // 获取自己的下一个节点
}
return sb.toString();
}
}
对LinekdList操作的性能分析:
1):增加操作:
双向链表可以直接获取自己的第一个和最后一个节点,
如果新增的元素在第一个或最后一个位置,那么操作只有1次.
2):删除操作(removeFisrt,removeLast):
如果删除第一个元素: 操作一次.
如果操作最后一个元素:操作一次.
如果删除中间的元素:
找到元素节点平均操作:(1+N)/2次.
找到节点之后做删除操作: 1次.
3):查询操作:
平均:(N+1)/2次
4):修改操作:
平均:(N+1)/2次
基于数组的列表和基于链表的列表的性能对比:
ArrayList:查询,更改较快,新增和删除较慢.
LinkedList:查询,更改较慢,新增和删除较快.
共有 0 条评论