双链表
public class DoubleLinkedList<E>{
private int size;
private Node<E> first;
private Node<E> last;
private static int ELEMENT_NOT_FOUND=-1;
private static class Node<E>{
E element;
Node<E> next;
Node<E> prev;
public Node(Node<E> prev,E element, Node<E> next) {
super();
this.element = element;
this.next = next;
this.prev=prev;
}
}
public DoubleLinkedList() {
first=new Node<E>(null,null, null);
}
public void clear() {
size=0;
first=null;
last=null;
}
public int size() {
return size;
}
public int indexOf(E element){
if(element==null){
for(int i=0;i<size;i++){
if(node(i).element==null){
return i;
}
}
}else{
for(int i=0;i<size;i++){
if(node(i).element.equals(element)){
return i;
}
}
}
return ELEMENT_NOT_FOUND;
}
@Override
public String toString() {
StringBuilder sb=new StringBuilder();
Node<E> node=first.next;
sb.append("[");
for(int i=0;i<size;i++){
sb.append(node(i).element);
if(i!=size-1){
sb.append(",");
}
}
sb.append("]");
return sb.toString();
}
public boolean isEmpty() {
return size==0;
}
public boolean contains(Object element) {
for(int i=0;i<size;i++){
if(element==null){
if(node(i).element==null){
return true;
}
}else{
if(node(i).element.equals(element)){
return true;
}
}
}
return false;
}
public void add(E element) {
add(size,element);
}
public Object get(int index) {
return node(index).element;
}
public Object set(int index, E element) {
Node<E> temp=node(index);
E e=(E) temp.element;
temp.element=element;
return e;
}
public void add(int index, E element) {
rangeCheckForAdd(index);
if (index==size) {
Node<E> oldList=last;
last=new Node<E>(oldList, element, null);
if (oldList==null) {
first=last;
}else {
oldList.next=last;
}
}else {
Node<E> prev=index==0?first:node(index-1);
Node<E> next=node(index);
Node<E> temp=new Node(prev,element,next);
if (prev==null) {
first=temp;
}else {
prev.next=temp;
}
if (next==null) {
last=temp;
}else {
next.prev=temp;
}
}
size++;
}
public E remove(int index) {
Node<E> next=null;
Node<E> temp=node(index);
Node<E> prev=index==0?first:node(index-1);
if (index==0) {
first=prev.next;
}else if(index==size-1){
last=last.prev;
last.next=null;
}else {
next=prev.next.next;
prev.next=next;
next.prev=prev;
}
size--;
return (E) temp.element;
}
private Node node(int index){
rangeCheck(index);
Node<E> temp1=first;
Node<E> temp2=last;
if (index<(size>>1)) {
for(int i=0;i<index;i++){
temp1=temp1.next;
}
return temp1;
}
if (index>=(size>>1)) {
for(int i=size-1;i>index;i--){
temp2=temp2.prev;
}
return temp2;
}
return null;
}
private void outBounds(int index){
throw new IndexOutOfBoundsException("Index:"+index+",Size: "+size);
}
private void rangeCheck(int index){
if(index<0||index>=size){
outBounds(index);
}
}
private void rangeCheckForAdd(int index){
if(index<0||index>size){
outBounds(index);
}
}
}
转载请注明原文地址:https://blackberry.8miu.com/read-44527.html