`
happy_zhourong
  • 浏览: 13306 次
  • 性别: Icon_minigender_2
文章分类
社区版块
存档分类
最新评论

用链表实现队列

    博客分类:
  • java
 
阅读更多
package nodelist;

public class LinkNode {
	public Object data;//节点内的数据对象
	public LinkNode next;//对下一个节点的引用
	
}


package nodelist;
/**
 * 用链表实现一个队列
 * @author zr
 *
 */
public class NodeList {
	private LinkNode root;
	private int size;
	private int count=1;
	LinkNode tem1=new LinkNode();//实例化一个节点tem1作为一个临时节点使用
	public NodeList(LinkNode root){
		this.root=root;
	}
	
	/**
	 * 向队列中加入一个元素
	 * @param obj 要向队列中加入的元素
	 */
	public void add(Object obj){
		
		if(root==null){
			root=new LinkNode();//实例化一个根节点
			root.data=obj;
			tem1=root;//将tem1指向根节点root
//			System.out.println("if---tem1.data="+tem1.data);
		}else{
//			System.out.println("else---tem1.data="+tem1.data);
			LinkNode tem=new LinkNode();//实例化一个节点tem
			tem.data=obj;
			//tem1=root;//注意:不能在此处将tem1指向root,否则,每次加入的新元素都加在了root后面
			tem1.next=tem;//将tem1的下一个节点指向tem
			tem1=tem;//将tem1指向tem
//			System.out.println("tem1.data="+tem1.data);
//			System.out.println("root.data="+root.data);
		}
	
			}
	
	/**
	 * 获取链表指定位置的节点
	 * @param index 指定的位置
	 * @return
	 */
	public LinkNode get(int index){
		LinkNode node=new LinkNode();
		LinkNode tem=root;
		while(count<index||count==index){
			if(count==index){
				node=tem;
			}
			count++;
			tem1=tem.next;
			tem=tem1;		
		}
		return node;
		
	}
	
	/**
	 * 获得队列的长度
	 * @return 返回队列的长度
	 */
	public int size(){
//		System.out.println("size---root.data="+root.data);
		LinkNode tem=root;
		while(tem!=null){
			size++;
			tem1=tem.next;
			tem=tem1;
			//System.out.println("tem.data="+tem.data);
		}
//		System.out.println("size="+size);
		return size;
		
	}

}


package nodelist;

import nodelist.LinkNode;
/**
 * 测试用链表实现的队列
 * @author zr
 *
 */
public class Test {
	private static LinkNode root;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Test t=new Test();
		NodeList nl=new NodeList(root);
		nl.add("根节点");
 
	        nl.add("节点1");
  
		nl.add("节点2");
 
		nl.add("节点3");
  
		nl.add("节点4");
  
		root=nl.getRoot();
		t.printLinkList(root);
		int size=nl.size();
		System.out.println("链表的长度为:"+size);
		LinkNode node=nl.get(4);
		System.out.println("第4个节点的值为:"+node.data);
	}
	
	
	/**
	 * 遍历一个链表
	 * @param lroot 链表的根节点
	 */
	public void printLinkList(LinkNode lroot){
		if(lroot!=null){
			System.out.println(lroot.data);
			LinkNode tem=new LinkNode();
			tem=lroot.next;
			printLinkList(tem);
		}
	}

}

 

结果:

根节点
节点1
节点2
节点3
链表的长度为:4
第4个节点的值为:节点3

 

往队列中添加元素:

 

第一个节点进来时:

tem1=root;//tem1指向根节点root,此时tem1root指向的是同一个地址

 

 
 

第二个节点进来时:

tem1.next=tem;//tem1的下一个节点指向tem,因为roottem1指向的是同一个地址,所以root.next也指向了tem

tem1=tem;//tem1指向tem,此时tem1tem指向同一个地址(此时tem指向的地址)

  

 

第三个节点进来时:

tem1.next=tem;//tem1的下一个节点指向tem,由于此时的tem1和上一次的tem指向的是同一个地址,所以tem.next也指向了tem

tem1= tem;//tem1指向tem,此时tem1tem指向同一个地址(此时tem指向的地址)

 

 

 

 

第四个节点进来时:

tem1.next=tem;//tem1的下一个节点指向tem, 由于此时的tem1和上一次的tem指向的是同一个地址,所以tem.next也指向了tem

 

tem1=tem;//tem1指向tem, 此时tem1tem指向同一个地址(此时tem所指向的地址) 

 

  

上面向队列中添加元素只能在链表为空的情况下添加,通过以上分析,下面我们来完善一下add()方法,使得无论链表是否为空,我们都可以向队列中添加元素。

 

分析:

当链表不为空时;

上例是首先将tem1指向了root节点,然后如上所述添加了新的节点;在这里,我们可以把tem1指向最后一个节点,然后如上所述添加新的节点。

 

tem1=end;//tem1指向end,此时tem1end指向同一地址

 

 

 

tem1.next=tem;//tem1.next指向了tem,由于上一步tem1tem1指向了同一地址,所以tem1也指向了tem

tem1=tem;//tem1指向tem,此时tem1tem指向了同一地址

 

 

 

我们如何获取最后一个节点呢?

1、  先求出已有链表的长度index,所以我们需要写一个求链表长度的方法LinkListSize()

2、  链表最后一个节点的位置就是index

3、  然后我们要获得最后一个节点,所以我们需要一个获取链表上某一指定位置节点的方法get(int index);

 

关键代码如下:

/**
 * 用链表实现一个队列
 * @author zr
 *
 */

public class NodeList {
	private LinkNode root;
	LinkNode tem1=new LinkNode();//实例化一个节点tem1作为一个临时节点使用
	public NodeList(LinkNode root){
		this.root=root;
	}
	
	/**
	 * 向队列中加入一个元素
	 * @param obj 要向队列中加入的元素
	 */
	public void add(Object obj){
		
		if(root==null){
			root=new LinkNode();//实例化一个根节点
			root.data=obj;
		}else{
			
			LinkNode tem=new LinkNode();//实例化一个节点tem
			tem.data=obj;
			int index=LinkListSize();//获得链表的长度
			tem1=get(index);//获得链表的最后一个节点
			//tem1=root;//注意:不能在此处将tem1指向root,否则,每次加入的新元素都加在了root后面
			tem1.next=tem;//将tem1的下一个节点指向tem
			tem1=tem;//将tem1指向tem
		}
	
	}
	
	/**
	 * 当链表不为空时,向队列中加入元素
	 * @param obj
	 * @return 返回链表根节点
	 */
	public LinkNode add1(Object obj){
		int index=LinkListSize();
		LinkNode end=get(index);
		System.out.println("end.data="+end.data);
		LinkNode tem=new LinkNode();
		tem.data=obj;
		tem1=end;//将tem1指向end
		tem1.next=tem;
		tem1=tem;
		System.out.println("tem1.data="+tem1.data);
		return root;
		
	}
	
	/**
	 * 获取链表指定位置的节点
	 * @param index 指定的位置
	 * @return
	 */
	public LinkNode get(int index){
		int count=1;
		LinkNode node=new LinkNode();
		LinkNode tem=new LinkNode();
		LinkNode tem1=new LinkNode();
		tem=root;
		while(count<index||count==index){
			if(count==index){
				node=tem;
			}
			count++;
			tem1=tem.next;
			tem=tem1;		
		}
		return node;
		
	}
	
	/**
	 * 获得队列的长度
	 * @return 返回队列的长度
	 */
	public int LinkListSize(){
		int size = 0;
		LinkNode tem=new LinkNode();
		LinkNode tem2=new LinkNode();
		tem2=root;
		while(tem2!=null){	
			tem=tem2.next;
			tem2=tem;
			size++;
		}
		
		return size;
		
	}

}


/**
 * 测试用链表实现的队列
 * @author zr
 *
 */
public class Test {
	private static LinkNode root,root2;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Test t=new Test();
		
		System.out.println("当链表为空时开始添加");
		NodeList nl=new NodeList(root);
		nl.add("根节点");
  
		nl.add("节点1");
  
		nl.add("节点2");
  
		nl.add("节点3");
  
		nl.add("节点4");
  
		root=nl.getRoot();		
		System.out.println("打印出链表:");
		t.printLinkList(root);
		int size=nl.LinkListSize();
		System.out.println("链表的长度为:"+size);
		LinkNode node=nl.get(4);
		System.out.println("第4个节点的值为:"+node.data);
		
		System.out.println();
		System.out.println("当链表不为空时开始添加");
		root2=t.createLinkList();
		NodeList nl2=new NodeList(root2);
		nl2.add("节点5");
  
		nl2.add("节点6");
  
		System.out.println("打印出链表:");
  
		root2=nl.getRoot();
		t.printLinkList(root2);
  
		int size2=nl2.LinkListSize();
		System.out.println("链表的长度为:"+size2);
		LinkNode node2=nl2.get(7);
		System.out.println("第7个节点的值为:"+node2.data);
	}
	
	/**
	 * 创建一个链表
	 * @return 返回链表的根节点
	 */
	public LinkNode createLinkList(){
		
		root=new LinkNode();
		LinkNode n1=new LinkNode();
		LinkNode n2=new LinkNode();
		LinkNode n3=new LinkNode();
		LinkNode n4=new LinkNode();
		root.data="根节点";
		root.next=n1;
		n1.data="节点1";
		n1.next=n2;
		n2.data="节点2";
		n2.next=n3;
		n3.data="节点3";
		n3.next=n4;
		n4.data="节点4";
		return root;
		
	}
	
	/**
	 * 遍历一个链表
	 * @param lroot 链表的根节点
	 */
	public void printLinkList(LinkNode lroot){
		if(lroot!=null){
			System.out.println(lroot.data);
			LinkNode tem=new LinkNode();
			tem=lroot.next;
			printLinkList(tem);
		}
	}

}

 
结果为:

当链表为空时开始添加
打印出链表:
根节点
节点1
节点2
节点3
节点4
链表的长度为:5
第4个节点的值为:节点3

当链表不为空时开始添加
打印出链表:
根节点
节点1
节点2
节点3
节点4
节点5
节点6
链表的长度为:7
第7个节点的值为:节点6

 

 

 

 

 

  • 大小: 14.8 KB
  • 大小: 23.2 KB
  • 大小: 31.6 KB
  • 大小: 35.8 KB
  • 大小: 22.9 KB
  • 大小: 33.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics