双向列表,这里无论删除还是增加都需要特别注意头节点与尾节点。
package shujujiegou;
/**
* Created by lcc on 2017/6/30.
*/
public class BidirectionalList {
public static void main(String[] args) {
BidirectionalList list = new BidirectionalList();
list.add("shaungqi");
list.add("dadada");
list.add("dadada1111");
list.add(2, "xxx123");
list.removeLast();
System.out.println(list.getSize() + " " + list.get(2).data);
list.add(1, "xxx123");
System.out.println(list.getSize() + " " + list.get(2).data);
list.remove(1);
System.out.println(list.getSize() + " " + list.get(0).data);
}
Node first;
Node last;
private int size;
public Node get(int i) {
cheackBorder(i);
Node getNode = first;
for (int j = 0; j < i; j++) {
getNode = getNode.next;
}
return getNode;
}
public void add(Object object) {
Node addNode = new Node();
addNode.data = object;
if (first == null) {
addNode.pre = null;
addNode.next = null;
first = addNode;
last = addNode;
} else {
last.next = addNode;
addNode.pre = last;
addNode.next = null;
last = addNode;
}
size++;
}
public void add(int i, Object object) {
cheackBorder(i);
Node addNode = new Node();
addNode.data = object;
Node getNode = get(i);
if (i == size - 1) {
last.next = addNode;
addNode.pre = last;
addNode.next = null;
last = addNode;
} else {
Node next = getNode.next;
getNode.next = addNode;
addNode.pre = getNode;
next.pre = addNode;
addNode.next = next;
}
size++;
}
public Node removeLast() {
Node oldLast = last;
Node newLast = last.pre;
last.pre = null;
newLast.next = null;
last = newLast;
size--;
return oldLast;
}
public Node remove(int i) {
cheackBorder(i);
Node removeNode = get(i);
if (i == 0 && size == 1) {
first = null;
}
else if (i == 0 && size != 1) {
Node next =first.next;
next.pre = null;
first =next;
} else{
Node pre = removeNode.pre;
Node next = removeNode.next;
pre.next = next;
next.pre = pre;
}
size--;
return removeNode;
}
public void cheackBorder(int i) {
if (i > size - 1) {
try {
throw new Exception("越界");
} catch (Exception e) {
e.printStackTrace();
}
}
}
public int getSize() {
return size;
}
public boolean isExmpt() {
return size ==0;
}
public class Node {
Node pre;
Object data;
Node next;
public Node() {
}
public Node(Node pre, Object data, Node next) {
this.pre = pre;
this.data = data;
this.next = next;
}
}
}