链表:区别于数组,有头节点和尾节点,和数据部分组成,查询男,增删快
package 手工实现;
public class Node2 {
int hash;
Object key;
Object value;
Node2 next;
}
package 手工实现;
import javax.management.RuntimeErrorException;
public class TestLinekedList {
private Node1 first;
private Node1 last;
private int size;
// [a,b,c]
public void add(Object obj) {
Node1 node = new Node1(obj);
if (first == null) {
// 链表为空时。第一次放,参数节点没有前后节点,首尾节点自然变成参数节点
node.previous = null;
node.next = null;
first = node;
last = node;
} else {
// 其余情况,从链表的最后开始放,参数的前节点为尾节点,后节点为空
// 头节点还是头节点,尾节点变成了参数节点
node.previous = last;
node.next = null;
last.next = node;
last = node;
}
size++;
}
// 插入方法
// [a,b,c]--->[a,b,d,c]
public void add(int index,Object obj) {
// 分情况判断,首位节点时候,
Node1 temp=getNode(index);
Node1 newNode=new Node1(obj);
if (temp!=null) {
// Node up=temp.previous;
//
// up.next=newNode;
// newNode.previous=up;
//
// newNode.next=temp;
// temp.previous=newNode;
// 同理,不过绕弯子
if (temp.equals(first)) { //失效了
temp.previous=newNode;
newNode.next=temp;
// newNode.previous=null;
size++;
return;
}if (temp.equals(last)) {
temp.next=newNode;
newNode.previous=temp;
newNode.next=null;
size++;
return;
}else {
temp.previous.next=newNode;
newNode.previous=temp.previous;
newNode.next=temp;
temp.previous=newNode;
size++;
return;
}
}
}
// 删除的方法
public void remove(int index) {
check(index);
Node1 temp=getNode(index);
if (temp==first) {
first=first.next;
}else if (temp==last) {//失效了
last=temp.previous;
last.next=null; //成功了
} else {
temp.previous.next=temp.next;
temp.next.previous=temp.previous;
}
size--;
}
// [a,b,c]
public Object get(int index) {
// 从first开始找,index多少,就next多少次
// 二次优化
this.check(index);
Node1 node=getNode(index);
return node!=null?node.element:null;
}
public void set(int index, Object obj) {
Node1 node=getNode(index);
node.element=obj;
}
public Node1 getNode(int index) {
// 通过索引获取节点
Node1 temp = null;
if (index < size >> 1) {
temp = first;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
}
if(index>size>>1){
temp = last;
for (int i = size-1; i >index; i--) {
temp=temp.previous;
}
}
return temp;
}
// 检测索引合法性
public void check(int index) {
if (index>size-1||index<0) {
throw new RuntimeException("索引不合法"+index);
}
}
public String toString() {
// 因为没了elementdate,所以打印方法变了
StringBuilder sb = new StringBuilder();
sb.append('[');
// 从首节点开始,没append一个数据次,指向下一个节点
Node1 temp = first;
while (temp != null) {
sb.append(temp.element + ",");
temp = temp.next;
}
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
public static void main(String[] args) {
TestLinekedList t1 = new TestLinekedList();
for (int i = 0; i < 10; i++) {
t1.add("mao" + i);
}
System.out.println(t1.get(0));
// t1.set(2, 66);
t1.add(0, 11);
// t1.remove(0);
System.out.println(t1);
System.out.println(t1.size);
}
}
有点繁琐,但算是干货,大家可以观看测试,有小问题,以后完善。