用JAVA实现双向链表

原创 2018年04月15日 17:20:39
interface Link{
	void add(Object obj);//尾插
	boolean remove(int index);//删除下标尾index的节点
	boolean set(int index,Object obj);//将下标为index的节点的值改为obj
	Object get(int index);//获取下标为index的节点的data值
	int contains(Object obj);//查找链表中有无obj内容的节点,有返回小标,无返回负一
	void clean();//清空链表
	void printList();//打印链表
	int length();//求链表长度
	Object[] toArray();//将链表转成数组
}
 class LinkImpl implements Link{
	 private Node first;
	 private Node last;
	 private int size=0;
	class Node{
		private Node prev;
		private Object data;
		private Node next;
		public Node(Node prev, Object data, Node next) {
			super();
			this.prev = prev;
			this.data = data;
			this.next = next;
		}
	}
	@Override
	public void add(Object obj) {
		Node tmp=this.last;
		Node newNode = new Node(tmp,obj,null);
		if(null==tmp){
			this.first=newNode;
			this.last=newNode;
			this.size++;
		}else{
			tmp.next=newNode;
			this.last=newNode;
			this.size++;
		}
		
	}
	//判断下标是否合法
	private boolean isLinkElement(int index){
		 if(index>=0 && index<this.size){
			 return true;
		 }
		 System.out.println("没有该元素");
		 return false;
	}
	public boolean remove(int index) {
		if(!(isLinkElement(index))){
			return false;
		}
		Node del=this.first;
		for(int i=0;i<index;i++){
			del=del.next;//此时del已经是索引元素;
		}
		//删除头节点
		if(del==this.first){
			if(del==this.last){
				this.first=this.last=null;
			}else{
				this.first=del.next;
				del.next.prev=null;
				del.next=null;
			}
		}
		//删除尾节点
		else if(del==this.last){
			this.last=del.prev;
			del.prev.next=null;
			del.prev=null;
		}else{
			//删除中间节点
			del.prev.next=del.next;
			del.next.prev=del.prev;
			del.prev=null;
			del.next =null;
		}
		this.size--;
		return true;
	}
	//找到小标为index的节点并返回该节点
	private Node findNode(int index){
		Node curNode=this.first;
		if(index<(this.size>>1))
		{
			for(int i=0;i<index;i++){
				curNode=curNode.next;
			}
			return curNode;
		}
		else{
			curNode=this.last;
			for(int i=this.size-1;i>index;i--){
				curNode=curNode.prev;
			}
			return curNode;
		}
	}
	public boolean set(int index, Object obj) {
		if(!(isLinkElement(index))){
			return false;
		}
		Node set = findNode(index);
		set.data =obj;
		return true;
	}
	@Override
	public Object get(int index) {
		if(!(isLinkElement(index))){
			return null;
		}
		Node get = findNode(index);
		return get.data;
	}
	@Override
	public int contains(Object obj) {
		Node cur = this.first;
		int i=0;
		while(cur!=null){
			if(obj==cur.data)
				return i;
			else{
				cur=cur.next;
				i++;
			}
		}
		return -1;
	}
	@Override
	public void clean() {
		Node del = null;
		while(this.first!=null){
			del =this.first;
			this.first=del.next;
			if(del.next!=null){
				del.next.prev=null;
				del.next=null;
			}else{
				del=null;
			}
			this.size--;
		}
		this.last =null;
	}
	@Override
	public void printList() {
		Object[] arr = this.toArray();
		for(int i=0;i<this.size;i++){
			System.out.println(arr[i]);
		}
	}
	@Override
	public int length() {
		
		return this.size;
	}
	@Override
	public Object[] toArray() {
		Object[] arr=new Object[size];
		int i=0;
		for(Node tmp=this.first;tmp!=null;tmp=tmp.next){
			arr[i++]=tmp.data;
		}
		return arr;
	}
	
}
 class Factory{
	 private Factory(){}
	 public static Link getInstance(){
		 return new LinkImpl();
	 }
 }
public class Test {
	public static void main(String[] args){
		Link link =Factory.getInstance();
		link.add("火车头");
		link.add("车厢1");
		link.add("车厢2");
		link.printList();
		System.out.println(link.length());
		//link.remove(4);
		//link.printList();
		//System.out.println(link.length());
//		link.set(1,"大卡车");
//		link.printList();
//		System.out.println(link.get(0));
//		System.out.println(link.contains("小汽车"));
		link.clean();
		link.printList();
		System.out.println(link.length());
	}
}

数据结构之双向链表(JAVA实现)

最近重新复习了一些基础的数据结构,发觉自己好多已经淡忘了,索性重新捡起来以前的知识,今天笔者回顾了一下链表的知识,用JAVA实现了一个双向链表,下面来看代码:public class DoubleLi...
  • as02446418
  • as02446418
  • 2015-07-28 23:25:29
  • 2132

Java双向链表实现

public class DoublyLinkList { private class Data{ private Object obj; private Data left = null;...
  • a19881029
  • a19881029
  • 2014-04-03 22:42:08
  • 8413

用java写一个双向链表

随手写的一个用java实现的链表。  package JavaHash;  /**  * 这个类定义了链表中应有的属性和获取方法  * @author zyn  *  */  publi...
  • wujiangming7
  • wujiangming7
  • 2016-03-14 15:18:29
  • 751

用双向链表实现一个栈和队列

双向链表实现堆栈 双向链表实现队列
  • duan19920101
  • duan19920101
  • 2016-06-15 23:43:53
  • 1547

JAVA实现双向链表终极解析!!熟练使用接口

双向链表结构和单向链表的区别:最后一个结点的链接地址上,单向链表是null,而双向链表是表头的链接地址。 即双向链表的head和last互相指向 示意图 表头为空       ...
  • defineshan
  • defineshan
  • 2016-08-21 10:35:47
  • 1223

双向链表的Java实现,以及相关函数的实现

1.定义一个节点类 public class Node { //存储的数据 private Object data; //前一个节点 private Node prev; //后一个...
  • daguairen
  • daguairen
  • 2016-10-06 10:10:42
  • 1078

实现一个双向链表的倒置功能(1->2->3 变成 3->2->1)

  • 2018年04月15日 13:41
  • 6KB
  • 下载

双向链表实现约瑟夫环

用双向链表实现约瑟夫环的代码
  • Learning_zhang
  • Learning_zhang
  • 2016-09-27 08:47:14
  • 277

Java 实现双向链表,基于双向链表实现双端队列

双向链表: 就是有双向指针 即 双向的链域 链结点的结构: ┌────┬────┬────────┐ │data│next│previous│ └────┴────┴────────┘ 双向链表不必...
  • jjwwmlp456
  • jjwwmlp456
  • 2014-10-26 00:29:49
  • 4754

java链表之--java双向链表的增删改查

单向链表只能从一个方向遍历链表,即只能查找结点的下一个结点(后继结点),而不能查找结点的上一个结点(前驱结点)。鉴于上述问题,引入了双向链表。由于双向循环链表包含双向链表的所有功能操作。因此,我们只讲...
  • basycia
  • basycia
  • 2016-07-06 15:27:06
  • 439
收藏助手
不良信息举报
您举报文章:用JAVA实现双向链表
举报原因:
原因补充:

(最多只允许输入30个字)