package test;
/**
* 双向链表
* @author 冷浪进
*
*/
public class MyLinkedList {
//节点
class Node{
//指向向一节点
Node pre;
//指向下节点
Node next;
//节点的数据
Object data;
//两个构造方法
public Node() { }
public Node(Node pre,Node next,Object data) {
this.pre = pre;
this.next = next;
this.data = data;
}
}
//保存头结点
Node head;
//保存尾节点
Node tail;
//链表大小
int size;

/**
* 获取链表大小
* @return
*/
public int size() {
return size;
}
/**
* 判断是否为空
* @return
*/
public boolean isEmpty() {
return size==0;
}
//查看节点数据的索引
public int indexOf(Object data) {
Node node = head;
for(int i=0; i<size&&node!=null; node=node.next,i++) {
if(node.data == data) {
return i;
}
}
return -1;
}
//查看指定索引的数据
private Node getNode(int index) {
//索引不在0到size之间
checkIndex(index);
//判断index的值是否大于size的一半,再确定从head开始,还是从tail开始
//size>>1 ===> size/2 size>>1效率高
if(index <= size>>1) {
Node node = head;
for(int i=0; i<=size/2&&node!=null;node=node.next, i++) {
if(i==index) {
return node;
}
}
}else {//如果index<size/2
Node node = tail;
for(int i=size-1; i>size/2&&node!=null;node=node.pre, i--) {
if(i==index) {
return node;
}
}
}
return null;
}
public Object getValue(int index) {
return getNode(index).data;
}
private void checkIndex(int i) {
if(i<0||i>size) {
throw new RuntimeException("无效的索引");
}
}
//在链表的尾端添加节点
public void add(Object data) {
//判断节点
if(head==null) {
head = new Node(null,null,data);
//只有一个节点,tail和head都指向该节点
tail = head;
}else {
//head不为空,创建一个新节点 ,作为最后一个节点
Node newNode = new Node(tail,null,data);
//首先最后一个节点指向新节点,然后再讲tail指向新节点
tail.next = newNode;
tail = newNode;
}
size++;
}
//在指定索引加节点
public void add(int i,Object data) {
//索引不在
checkIndex(i);

if(head==null) {
head = new Node(null,null,data);

}else {
Node node = head;
for(int j=0; j<size&&node!=null; node=node.next,j++) {
if(i==j) {
Node no = new Node(node.pre,node,data);
node.pre.next = no;
node.pre = no;
}
}
}
size++;
}
//删除最后一个节点
public Object remove() {
return remove(size-1);

}
//删除指定索引的节点
public Object remove(int i) {
//判断索引是否存在
checkIndex(i);
//获取索引为i的节点
Node node = getNode(i);
if(node.pre==null) {
head = node.next;
}else if(node.next==null) {
tail = tail.pre;
}else {
node.pre.next = node.next;
node.next.pre = node.pre;
}
size--;
return node.data;
}
//判断是否包含key
public boolean contains(Object key) {
//直接判断可以的索引是否为-1,如果是-1不存在
if(indexOf(key)==-1) {
return false;
}
return true;
}
//用data替换i索引处的数据
public void replace(int i,Object data) {
//判断索引是否存在
checkIndex(i);
Node node = head;
for(int j=0; j<size&&node!=null; node = node.next, j++) {
if(i==j) {
node.data = data;
}
}
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer("[");
Node node = head;
for(int i=0; i<size&&node!=null; node=node.next,i++) {
sb.append(node.data+",");
}
return sb.delete(sb.length()-1, sb.length()).append("]").toString();
}


public static void main(String[] args) {
MyLinkedList my = new MyLinkedList();
my.add(1);
my.add(2);
my.add("34");
my.add("冷浪进");
System.out.println(my.size);
my.add(1,"冷霞");
my.replace(0, "王永先");
System.out.println(my.contains("冷浪进"));
my.remove(2);
System.out.println(my.getValue(2));
System.out.println(my.indexOf("34"));
System.out.println(my);
}
}

运行结果

4
true
34
2
[王永先,冷霞,34,冷浪进]

 

posted on 2019-04-17 20:55  如果······  阅读(314)  评论(0编辑  收藏  举报