链表小结

      今天学习了链表,简单说一下自己的心得体会吧

一、定义

      同队列、集合相类似,链表是一种无序、不连续的存储结构,而其中的存储顺序是通过链表中的指针连接次序实现的。链表有一系列的节点组成,节点不具有固定长度,可以随时添加或删除。链表通常由两部分组成,一个是存储数据元素的数据域,另一个是存数下一个节点地址的指针域。而双链表具有两个链域,一个存储子节点的地址,称为右链域,一个存储父节点的地址,称为左链域。链表的突出优点是,可以比较方便的插入和删除操作。

      分类:java中的链表可以分为单向链表、双向链表和环形链表。

             单向链表只能从头至尾进行检索,双向链表可以向上或向下两个方向进行检索,而环形链表则是将双链表首尾相连,任何 一个元素沿任何一个方向,都可以检索所有元素。

           链表中的元素通常设为object类,因为object类是所有类的超类,任何数据类型的元素都可以存入其中。

  下面是我实现链表的查找、插入、删除、修改等基本功能的代码。

package 链表;
/**
 * 链表节点类
 * @author Administrator
 *
 */

public class LinkNode {
	//节点内的数据对象
	private Object obj;
	//对下一结点的引用
	private LinkNode child;
	private LinkNode parent;
	
	public LinkNode(Object obj){
		this.obj = obj;
	}
	public void setObj(Object obj){
		this.obj = obj;
	}
	public Object getObj(){
		return obj;
	}
	public void setChild(LinkNode child){
		this.child = child;
	}
	public LinkNode getChild(){
		return child;
	}
	public void setParent(LinkNode parent){
		this.parent = parent;
	}
	public LinkNode getParent(){
		return parent;
	}
	

}

 

/**
 * 双向链表
 * @author Administrator
 *
 */
public class LinkList {
	private static LinkNode head = null; 
	private  static LinkNode foot = null;
	
	public static void main(String []args){
		LinkList list = new LinkList();
		 list.createLink();
		list.reSet("新来的",0);
		// list.delete(2);
		
		list.printLinkList(head);
		int i = list.length();	
		//LinkNode node = list.getLinkNode(3);
		System.out.println("&&&&&&&"+i);
	}
	/**
	 * 手工创建一个链表
	 * @return
	 */
	public LinkNode createLink(){
	    head = new LinkNode("根节点");
	    LinkNode head1 = new LinkNode("节点一");
	    LinkNode head2 = new LinkNode("节点二");
	    LinkNode head3 = new LinkNode("节点三");
	    
	    head.setChild(head1);
	    head1.setParent(head);
	    
	    head1.setChild(head2);
	    head2.setParent(head1);
	    
	    head2.setChild(head3);
	    head3.setParent(head2);
	   /**********************尾结点要赋值*************************/ 
	    foot = head3;
	   // head3.setChild(foot);
	    //foot.setParent(head3);
	    
		return head;
	}
	/**
	 * 增加一个新节点
	 */
	public void add(Object obj){
		 LinkNode node = new LinkNode(obj);
		if(head == null ){
		    head = node;  
		    foot = head;
		}else{
			foot.setChild(node); 
			node.setParent(foot);
			foot = node;
		}
		
	}
	/**
	 * 获取长度
	 * @return
	 */
	public int length(){
	    int count = 0;
	   if(head == null){
		   return count;
	   }
	   LinkNode node = head.getChild();
	   while(node!=null){
	       count++;
	       node = node.getChild();
	   }
	   return count+1;
	   
	}
	/**
	 * 获取指定位置的节点
	 */
	public LinkNode getLinkNode(int index){
		if(index ==0){
			return head;
		}
		int i = 1;
		LinkNode  node = head.getChild();
		while(i!=index){
			node = node.getChild();
			i++;
		}
		
		return node;
	}
	/**
	 * 在指定位置增加新节点
	 * @param obj :链表中的元素
	 * @param index :要插入节点的位置
	 */
	public void add(Object obj ,int index){
		
	    while(index>length()||index<0){
	    	throw new java.lang.RuntimeException("下标越界:"+index+",size:"+length());
	    }
	    LinkNode node = new LinkNode(obj);
	    if(index ==0){
	        if(head ==null){
	        	head =node;
	        }else{
	        	
	        	node.setChild(head);
	        	System.out.println("<<<<<<<<<<<<<<");
	        	head.setParent(node);
	        	head = node;
	        	
	        }
	    }else{
	    	LinkNode node2 = this.getLinkNode(index);
	    	LinkNode fnode = node2.getParent();
	    	fnode.setChild(node);
	        node.setParent(fnode);
	        
	        node.setChild(node2);
	        node2.setParent(node);
	    }
	    	
	  
	}
	/**
	 * 删除指定位置的节点
	 * @param index
	 */
	public void delete(int index){
	    while(index>length()||index<0){
	        throw new java.lang.RuntimeException("下标越界:"+index+",size:"+length());
        }
	    LinkNode node = this.getLinkNode(index);
	    LinkNode fnode = node.getParent();
	    LinkNode cnode = node.getChild();
	    if(fnode == null){
	    	head = cnode;
	    }else if(cnode == null){
	    	foot =fnode;
	    }else{
	    	fnode.setChild(cnode);
	    	cnode.setParent(fnode);
	    	}
	}
	/**
	 * 修改指定位置节点
	 * @param index:所修改节点的位置
	 */
	public void reSet(Object obj,int index){
		while(index>this.length()||index<0){
			throw new java.lang.RuntimeException("下标越界"+index+",size:"+length());
		}
		LinkNode newnode = new LinkNode(obj);
		if(index ==0){
			if(head ==null){
				head =newnode;
			}else{
				LinkNode cnode = head.getChild();
				newnode.setChild(cnode);
				cnode.setParent(newnode);
				/***********************注意为链表头赋值******************************************/
				head =newnode;
			}
		}else{
			LinkNode node = this.getLinkNode(index);
			LinkNode cnode = node.getChild();
			LinkNode fnode = node.getParent();
			fnode.setChild( newnode);
			newnode.setParent(fnode);
			newnode.setChild(cnode);
			cnode.setParent(newnode);	
		}
		
	}
	/**
	 * 遍历链表
	 * @param foot:链表根节点
	 */
	public void printLinkList(LinkNode nodel){
		if(nodel!=null){
			Object obj = nodel.getObj();
			System.out.println(obj);
			LinkNode node = nodel.getChild();
			printLinkList(node);	
		}
		
	}
	

}

 

    链表与其它数据结构相比,给我最大的感觉就是,他很容易进行数据的查找、增加删除等操作,方便灵活,为很多管理系统的制作提供了很大的方便

            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值