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,此时tem1和root指向的是同一个地址
第二个节点进来时:
tem1.next=tem;//将tem1的下一个节点指向tem,因为root和tem1指向的是同一个地址,所以root.next也指向了tem
tem1=tem;//将tem1指向tem,此时tem1和tem指向同一个地址(此时tem所指向的地址)

第三个节点进来时:
tem1.next=tem;//将tem1的下一个节点指向tem,由于此时的tem1和上一次的tem指向的是同一个地址,所以tem.next也指向了tem
tem1= tem;//将tem1指向tem,此时tem1和tem指向同一个地址(此时tem所指向的地址)
第四个节点进来时:
tem1.next=tem;//将tem1的下一个节点指向tem, 由于此时的tem1和上一次的tem指向的是同一个地址,所以tem.next也指向了tem
tem1=tem;//将tem1指向tem, 此时tem1和tem指向同一个地址(此时tem所指向的地址)
上面向队列中添加元素只能在链表为空的情况下添加,通过以上分析,下面我们来完善一下add()方法,使得无论链表是否为空,我们都可以向队列中添加元素。
分析:
当链表不为空时;
上例是首先将tem1指向了root节点,然后如上所述添加了新的节点;在这里,我们可以把tem1指向最后一个节点,然后如上所述添加新的节点。
tem1=end;//将tem1指向end,此时tem1和end指向同一地址
tem1.next=tem;//将tem1.next指向了tem,由于上一步tem1和tem1指向了同一地址,所以tem1也指向了tem
tem1=tem;//将tem1指向tem,此时tem1和tem指向了同一地址
我们如何获取最后一个节点呢?
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