package cn.java.mhz;
/**
* 双向链表
* 手动实现LinkedList
* 增加删除效率高,但是查询效率低
* 增加泛型
* remove移除操作
* @author asus
*
*/
class Node{
/*上一个节点 下一个节点 此节点元素数据*/
private Node previous;
private Node next;
private Object element;
//构造器重载
public Node(Node previous, Node next, Object element) {
super();
this.previous = previous;
this.next = next;
this.element = element;
}
public Node(Object element)
{
this.element = element;
}
public Node(Node previous , Object element)
{
this.previous = previous;
this.element = element;
}
public Node()
{
}
//set get方法
public Node getPrevious() {
return previous;
}
public void setPrevious(Node previous) {
this.previous = previous;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public Object getElement() {
return element;
}
public void setElement(Object element) {
this.element = element;
}
}
public class MyLinkedList<E> {
private Node first;
private Node last;
private int size=0;
//检查是否越界
private void checkIndex(int index)
{
int k = this.length();
if(index>k-1||index<0) {
throw new RuntimeException("\nIndex不合法 "+index+"\nnow length is "+k);
}
}
//length方法
public int length()
{
int solve=0;
for(Node k=first;k!=last;k=k.getNext()) {
solve++;
}
solve+=1;
return solve;
}
//set方法
public void set(E element,int index)
{
checkIndex(index);
Node solve = new Node();
solve =first;
int k=0;
for(;k<index;solve=solve.getNext(),k++);
solve.setElement(element);
}
//向链表中插入元素 [0,length-1]
public void add(int index,E element)
{
checkIndex(index);
Node P2 = new Node(element);
Node solve = new Node();
solve = first;
int k = 0;
for(;k<index;solve=solve.getNext(),k++);
Node P = solve.getPrevious();
Node P1 = solve.getNext();
if(index==0||index==size-1) {
if(index==0) {
solve.setPrevious(P2);
P2.setNext(solve);
first=P2;
size++;
}
else {
this.append(element);
}
}
else {
P.setNext(P2);
P2.setPrevious(P);
solve.setPrevious(P2);
P2.setNext(solve);
size++;
}
}
//从链表中删除元素
public void remove(int index)
{
checkIndex(index);
Node solve = new Node();
solve = first;
int k = 0;
for(;k<index;solve=solve.getNext(),k++);
Node P = solve.getPrevious();
Node P1 = solve.getNext();
if(P!=null) {
P.setNext(P1);
}
if(P1!=null) {
P1.setPrevious(P);
}
if(index==0) {
first=P1;
}
if(index==size-1)
{
last=P;
}
size--;
}
//get方法
public E get(int index)
{
checkIndex(index);
Node solve = new Node();
int k=1;
for(Node i =first; k<=index+1; i=i.getNext(),k++)
{
solve = i;
}
return (E)solve.getElement();
}
//检查链表是否包含某元素
public boolean contain(Object element)
{
Node solve = new Node();
solve = first;
for(;solve!=last;solve=solve.getNext())
if(solve.getElement().equals(element)) return true;
if(last.getElement().equals(element)) return true;
return false;
}
//向双向连表中向后添加元素
public void append(E obj)
{
Node node = new Node(obj);
if(first == null) {
node.setPrevious(first);
node.setNext(last);
first = node;
last = node;
}
else {
node.setPrevious(last);
node.setNext(null);
last.setNext(node);
last=node;
}
size++;
}
//重写toString方法
@Override
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append("[");
for(Node i = first ; i!=last; i=i.getNext())
{
sb.append(i.getElement()+",");
}
sb.append(last.getElement());
sb.append("]");
return sb.toString();
}
//main方法
public static void main(String[] args)
{
MyLinkedList <String> list = new MyLinkedList<String>();
list.append("mhz");
list.append("wzl");
list.append("yxk");
list.append("mhz");
list.append("wzl");
list.append("yxk");
System.out.println(list.toString());
System.out.println(list.get(2));
System.out.println(list.length());
list.remove(2);
System.out.println(list.toString());
System.out.println(list.length());
list.set("shit", 2);
System.out.println(list.toString());
System.out.println(list.contain("mhz"));
System.out.println(list.contain("wzl"));
System.out.println(list.contain("jk"));
list.remove(0);
System.out.println(list.toString());
list.remove(3);
System.out.println(list.toString());
list.add(2, "wzl");
System.out.println(list.toString());
list.add(0, "mhz");
System.out.println(list.toString());
list.add(1, "yxk");
System.out.println(list.toString());
System.out.println(list.length());
}
}