数据结构与算法学习笔记02-双向链表

  • 1 String、StringBuffer、StringBuilder区别
    String类一旦声明不可以改变,只能改变内存指向;
    StringBuffer对字符串增删,线程安全、速度慢
    StringBuilder对字符串增删 ,线程不安全、速度快
package 链表;
import 链表.AbstractList;
/**
 * 双向链表
 */
public class LinkedList<E> extends AbstractList<E>{
	private Node<E> first;
	private Node<E> last;
	private static class Node<E> {
		E element;
		Node<E> prev;
		Node<E> next;
		public Node(Node<E> prev,E element,Node<E> next) {
			this.prev = prev;
			this.element = element;
			this.next = next;
		}
    /**
     * 重写toString,打印前后元素
     */
	public String toString() {
		StringBuilder sb = new StringBuilder();
		if (prev!=null) {
			sb.append(prev.element);
		}else {
			sb.append("null");
		}
		sb.append("_").append(element).append("_");
		if (next!=null) {
			sb.append(next.element);
		}else {
			sb.append("null");
		}
		return sb.toString();
	}
	}
	public void clear() {
		size = 0;
		first = null;
		last = null;
	}

	public int size() {
		return size;
	}
	public boolean isEmpty() {
		return size == 0;
	}
	public boolean contains(E element) {
		return indexOf(element)!=ELEMENT_NOT_FOUND;
	}
	public E get(int index) {
		return node(index).element;
	}
	public E set(int index, E element) {
		Node<E> node = node(index);
		E oldE = node.element;
		node.element = element;
		return oldE;
	}
	public void add(int index, E element) {
		rangeCheckForAdd(index);
		if (index == size) {//最后添加元素
			Node<E> oldLast = last;
			//last指向新生成的结点
			last = new Node<>(oldLast,element,null);
			if (oldLast == null) {//原链表没有结点
				first = last;
			}else {
				//旧的最后一个元素指向插入的元素
				oldLast.next =last;				
			}
		}else {
			Node<E> next = node(index);
			Node<E> prev = next.prev;
			Node<E> node = new Node<>(prev,element,next);
			next.prev = node;
			if(prev == null) {//index == 0
				first = node;
			}else {
				prev.next = node;
			}
		}
		size++;
	}
	public E remove(int index) {
		rangeCheck(index);
		Node<E> node = node(index);
		Node<E> prev = node.prev;
		Node<E> next = node.next;
		if (prev == null) {//index == 0
			first = next;
		}else {
			prev.next = next;
		}
		if (next == null) {//index==size-1
			last = prev;
		}else {
			next.prev = prev;			
		}
		size--;
		return node.element;
	}
	public int indexOf(E element) {
		if(element==null) {
			Node<E> node = first;
			for (int i = 0; i < size; i++) {
				if (node.element == null) {return i;}
				node = node.next;
			}
		}else {
			Node<E> node = first;
			for(int i=0;i<size;i++) {
				if(element.equals(node.element)) return i;
				node = node.next;
			}
		}
		return ELEMENT_NOT_FOUND;
	}
	/**
	 * @Description:获取index位置对应结点对象
	 */
	private Node<E> node(int index) {
		rangeCheck(index);
		Node<E> node;
		//index小于size的一半,从头开始找
		if(index<(size>>1)) {
			node = first;
			for (int i = 0; i < index; i++) {
				node = node.next;
			}
		}else {
			node = last;
			for (int i = size-1; i > index; i--) {
				node = node.prev;
			}
		}
		return node;
	}

	public String toString() {
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.append("size=").append(size).append(",[");
		Node<E> node = first;
		for (int i = 0; i < size; i++) {
			if(i!=0) {
				stringBuilder.append(",");
			}
			//默认toString
			stringBuilder.append(node);
			node = node.next;
		}
		stringBuilder.append("]");
//		Node<E> node1 = first;
//		while(node1!=null) {
//			node1 = node1.next;
//		}
		return stringBuilder.toString();
	}
}
发布了114 篇原创文章 · 获赞 32 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/moqianmoqian/article/details/104711000