Java链表实现_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java链表实现

Java链表实现

 2014/11/15 19:07:06  千年西瓜  程序员俱乐部  我要评论(0)
  • 摘要:学过了C、C++的链表,Java的链表也大致相同,唯一的区别就是Java中不存在指针的概念,只有引用,那么链表中的每一个节点的内容就是数据域和引用域(存储数据和指向下一个节点的引用)Java中单链表的实现要先定义节点类、定义链表类(实现添加、删除、插入节点等操作)节点类:package链表练习;publicclassNode{privateObjectdata;//数据privateNodenext;//引用域publicObjectgetdata(){returndata;
  • 标签:实现 Java
学过了C、C++的链表,Java的链表也大致相同,唯一的区别就是Java中不存在指针的概念,只有引用,那么链表中的每一个节点的内容就是数据域和引用域(存储数据和指向下一个节点的引用)
Java中单链表的实现要先定义节点类、定义链表类(实现添加、删除、插入节点等操作)
节点类
class="java">
package 链表练习;

public class Node {

	private Object data;//数据
	private Node   next;//引用域
	
	public Object getdata()
	{
		return data;
		
	}
	public void setdata(Object data)
	{
		  this.data=data;
		
	}
	public Node getNext()
	{
		return next;
	}
	public void setNext(Node next)
	{
		this.next=next;
	}
	
}

有了节点类,就可以在链表类中实现对节点的插入删除替换等操作
package 链表练习;

public class LinkedList {

		private Node root;// 声明一个根节点
		private Node tail;// 声明一个尾节点
		private int size;// 声明记录链表中节点的个数

		/**
		 * 添加节点的方法
		 * 
		 *  newnode要被添加的节点对象
		 */
		public void add(Node newnode) {
			// 判断root是否为null,如果是,则表示此时第一次添加节点
			if (root ==null) {
				root = newnode;// 将新节点给根节点
				tail = newnode;// 将新节点给尾节点
			} 
			else {// 将新节点添加到尾节点之后。
				tail.setNext(newnode);// 将新节点设置为尾节点的下一个节点
				tail = newnode;// 将尾节点移动到新添加的节点上,此处表示是末尾节点。
			}
			size++;// 让计数器加1
		}

		/**
		 * 移除指定索引位置的数据
		 * 在指定位置处删除节点
		 * 返回移除的数据
		 */
		public Object removeindex(int index) {
			Node node = root;//遍历的节点,从根节点开始遍历
			Node removeNode;//要移除的节点
			if (index == 0) {//如果要移除的是第一个节点
				root = node.getNext();//将root的下一个节点设置为root
				
				removeNode = node;//把原来的root赋给要移除的节点
			} else {//如果要移除的是不是第一个节点
				    //找到要移除节点的前一个节点对象
				for (int i = 0; i < index - 1; i++) {
					node = node.getNext();
				}
				//判断要移除的节点是否是最后一个
				if (index == size - 1) {
					//将node的下一个节点赋给要移除的节点
					removeNode = node.getNext();
					//将node的下一个节点引用设置为null
					node.setNext(null);
				} else {//要移除的节点是在链表的中间
					//将node的下一个节点赋给要移除的节点
					removeNode = node.getNext();
					//将removeNode下一个节点的引用赋给nextNode
					Node nextNode = removeNode.getNext();
					//将removeNode的下一个节点nextNode赋给node,保持链表不会中断
					node.setNext(nextNode);
				}
			}
			size--;
			//返回要移除节点的数据域对象
			return removeNode.getdata();
		}

		/**
		 * 获取指定索引位置节点的数据
		 * 
		 * @param index指定的索引位置
		 */
		public Object getData(int index) {
			if (index < 0 || index >= size)//如果索引位置超出范围
				return null;
			Node node = root;//定义用来遍历的节点
			// 循环获取到指定索引位置的节点
			for (int i = 0; i < index; i++) {
				node = node.getNext();
			}
//			System.out.println(node);
			// 返回指定索引位置的元素
			return node.getdata();
		}
		
		
		/**
		 * 修改索引节点的数据
		 * @return 
		 */
		public Object changedata(int index ,Object data)
		{
			if(index<0||index>=size)
				return null;//如果索引位置超出范围,返回空
			Node node=root;
			for(int i=0;i<index;i++){
				node=node.getNext();
			}
			 node.setdata(data);//改变指定节点的数据
			 return node.getdata();//返回索引位置的数据
		}

		
		
		/**
		 * 移除指定的数据,根据对象的属性值来移除数据
		 *  removedata为指定要移除的数据
		 *  返回移除的次数
		 */
		public int removeData(Object  removedata){
			Node node = root;//定义用来遍历的节点
			int count=0;
			int index;
		    Node removeNode;
			
		   //如果要移除的是头节点
		    if(root.getdata().equals(removedata))
		    	{root=root.getNext();
		    	 count=1;
		    	}
		    // 循环获取到指定索引位置的节点
			for (int i = 0; i < size-2; i++) {
				
				if(node.getNext().getdata().equals(removedata))//如果node的下一节点的数据就是要找的数据,现在node就是要移除数据的前一个指针
				{
					 index=i+1;
					 count++;
					 removeNode = node.getNext();//removeNode就是要移除数据的节点
					//获取要删除节点的下一个节点,定义为nextNode
				     Node nextNode = removeNode.getNext();
					//将removeNode的下一个节点nextNode赋给node,这样要移除节点的前一个节点就跳过removeNode直接指向nextNode了
					 node.setNext(nextNode);
				}
				node = node.getNext();//获取下一节点
				
			}
			size=size-count;
			return count;//返回移除指定数据的次数
			
			
		}
		
		
		/**
		 * 返回链表中节点总数
		 * 
		 * @return 返回size属性
		 */
		public int size() {
			return size;
		}
		
		/**
		 *在指定位置插入节点
		 *index为指定索引位置
		 */
		public void insert(int index,Object s)
		{
			if(index<0||index>size)
				System.out.println("超出范围重新输入");
			Node temp=root;//定义要遍历的节点,从根节点开始遍历
			Node insertNode=new Node();//定义要添加的节点
			insertNode.setdata(s);
			
			
			for(int i=0;i<index-1;i++)//得到要原链表添加位置的前一个节点
			{
				temp=temp.getNext();
			}
			 
			  insertNode.setNext(temp.getNext());
			  temp.setNext(insertNode);//设置这个节点指向要插入的节点
//			Node temp1=new Node();  
//	        temp1=temp.getNext();  
//	        temp.setNext(insertNode);  
//	        insertNode.setNext(temp1); 
		
		
			size++;
		}
		

	}












上一篇: Java中的静态关键字static 下一篇: 没有下一篇了!
发表评论
用户名: 匿名