单链表的基本操作

单链表图示

单链表的删除节点操作

单链表的添加节点操作(将节点添加到末尾)

单链表的添加节点操作(将节点添加到中间)

定义单链表类


public class NodeList {
    Object object;
	NodeList next;
	public NodeList(Object object) {
		this.object = object;
	}
}

定义操作接口

public interface MyList {
	void delete(int index);
	void delete(Object element);
	void add(Object element);
	void update(int index,Object newElement);
	boolean contains(Object target);
	Object at(int index);
	int indexOf(Object element);

}

定义操作实现类


public class SingleLinkList implements MyList{
	private NodeList head; //头节点
	private NodeList last;
	int size;

	public void delete(int index) {
		if(index<0||index>=size) return;   //处理边界
		int i=0;         //节点的索引
		NodeList p=head;
		NodeList pre=null;
		while(p!=null){
			if(i==index){
				if(p==head){      //如果删除的是头节点
					head=head.next;   //头节点后移
				}else {
					pre.next=p.next;
				}
				size--;
				break;
			}
			pre=p;         //前驱指针后移
			p=p.next;     //p指针后移
			i++;
		}

	}

	public void delete(Object element) {
		NodeList p=head;    //头本身不能动
		NodeList pre=null;  //p节点的前一个节点    相当于p的前驱   因为是单链表   要实现删除的话   必须要2个指针挨着移动才可以
		while(p!=null){
			if(p.object.equals(element)){
				if(p==head){     //如果删除的是头部节点
					head=head.next;       //将头部节点后移
				}else {
					pre.next=p.next;
				}
				size--;
				break;    //删除元素后  没必要再继续移动了
			}
			pre=p;        //前驱指针后移
			p=p.next;     //p指针后移
		}

	}

	public void add(Object element) {
		if(head==null){                   //链表为空
			head=new NodeList(element);
			last=head;          //头节点   尾节点都是这个节点
		}else {
			last.next=new NodeList(element);
			last=last.next;   //尾指针后移
		}
		size++;          //链表的大小+1

	}

	public void update(int index, Object newElement) {
		if(index<0||index>=size) return; //处理边界
		int i=0;         //节点的索引
		NodeList p=head;
		while(p!=null){
			if(i==index){
				p.object=newElement;
				break;
			}
			p=p.next;     //p指针后移
			i++;
		}
	}

	public boolean contains(Object target) {
		NodeList p=head;
		while(p!=null){
			if(p.object.equals(target)){
				return true;
			}
			p=p.next;     //p指针后移
		}
		return false;
	}

	public Object at(int index) {
	if(index<0||index>=size) return null; //处理边界
		int i=0;         //节点的索引
		NodeList p=head;
		while(p!=null){
			if(i==index){
				return p.object;
			}
			p=p.next;     //p指针后移
			i++;
		}
		return null;
	}

	public int indexOf(Object element) {
		int i=0;         //节点的索引
		NodeList p=head;
		while(p!=null){
			if(p.object.equals(element)){
				return i;
			}
			p=p.next;     //p指针后移
			i++;
		}
		return -1;
	}





	@Override
	public String toString() {
	NodeList p=head;    //不要随便去动原来的饿头节点  因此复制一份
		StringBuilder sb=new StringBuilder("[");
		while(p!=null){
			sb.append(p.object);
			p=p.next;
			if(p!=null){
				sb.append(",");
			}
		}
		sb.append("]");
		return sb.toString();
	}
}

双链表的基本操作

双链表图示

双链表删除节点

双链表添加节点

双链表定义类


public class DoubleListNode {
	 DoubleListNode next;     //前驱
	 DoubleListNode pre;      //后继
	 Object data;


	public DoubleListNode(Object data) {
		this.data = data;
	}
}

定义接口操作

public interface MyList {
	void delete(int index);
	void delete(Object element);
	void add(Object element);
	void update(int index,Object newElement);
	boolean contains(Object target);
	Object at(int index);
	int indexOf(Object element);

}

双链表操作实现类


public class DoubleNode implements MyList {
	//将头节点和最后一个节点赋空     实际的第一个元素是head.next
	private DoubleListNode head=new DoubleListNode(null);
	private DoubleListNode last=new DoubleListNode(null);
	private int size;

	public DoubleNode() {      //初始化空的双链表
		head.next=last;
		last.pre=head;
	}

	public void delete(int index) {
		if(index<0||index>=size) return;
		int i=0;
		DoubleListNode p=head.next;
		while(p!=last){
			if(i==index){
				p.pre.next=p.next;
				p.next.pre=p.pre;
				//更快的被垃圾回收
				p.next=null;
				p.pre=null;
				size--;
				break;
			}
			p=p.next;
			i++;
		}
	}

	public void delete(Object element) {
		DoubleListNode p=head.next;
		while(p!=last){
			if(p.data.equals(element)){
					//只需要维护2条指针即可
					p.pre.next=p.next;
					p.next.pre=p.pre;
					//为什么要加这2条语句   为了更快的成为垃圾回收对象
					p.pre=null;
					p.next=null;
					size--;
					break;
				}
			p=p.next;
		}
	}

	public void add(Object element) {
		DoubleListNode newNode=new DoubleListNode(element);
		//维护了四条指针   如果不明白可以看图帮助
		last.pre.next=newNode;
		newNode.next=last;
		newNode.pre=last.pre;
		last.pre=newNode;
		size++;
	}

	public void update(int index, Object newElement) {
		if(index<0||index>=size)return;
		DoubleListNode p=head.next;
		int i=0;
		while (p != last) {
			if(i==index){
				p.data=newElement;
				break;
			}
			i++;
			p=p.next;
		}
	}

	public boolean contains(Object target) {
		DoubleListNode p=head.next;
		while(p!=last){
			if(p.data.equals(target)){
				return true;
			}
			p=p.next;
		}
		return false;
	}

	public Object at(int index) {
		DoubleListNode p=head.next;
		int i=0;
		while(p!=last){
			if(i==index){
				return p.data;
			}
			i++;
			p=p.next;
		}
		return null;
	}

	public int indexOf(Object element) {
		DoubleListNode p=head;
		int i=0;
		while(p!=last){
			if(p.data.equals(element)){
				return i;
			}
			i++;
			p=p.next;
		}
		return -1;
	}


	@Override
	public String toString() {
		StringBuilder sb=new StringBuilder("[");
		DoubleListNode p=head.next;
		while(p!=last){
			sb.append(p.data);
			if(p.next!=last) {
				sb.append(",");
			}
			p=p.next;
		}
		return sb.toString();
	}
}

注:上述图示是根据代码画出来的,不一定和教材上的相同,可能有所差异,请读者自行鉴别