JAVA双链表的实现

 首先需要定义一个节点类:Node
/**
 * 链表的数据载体:节点
 * @author Administrator
 *
 */
public class Node {
	
	//保存的真正数据
	public Object o;
	
	
	//上一个节点的引用
	public Node pre;
	
	//下一个节点的引用
	public Node next;

	public Node(Object o) {
		this.o = o;
		this.pre = null;
		this.next = null;
	}

	public Object getO() {
		return o;
	}

	public void setO(Object o) {
		this.o = o;
	}

	public Node getPre() {
		return pre;
	}

	public void setPre(Node pre) {
		this.pre = pre;
	}

	public Node getNext() {
		return next;
	}

	public void setNext(Node next) {
		this.next = next;
	}
	
 
	//判断链表是否有下一个节点
	public boolean hasNext(){
		return this.getNext() != null;
	}
	

}
2. 链表类
/**
 * 双向链表:基本操作:
 * 追加链表:void addNode(Node node);
 * 插入节点:void insertNode(Node node);
 * 删除链表:void delNode(Node node);
 * 查询链表(boolean):boolean findNode(Node node);
 * 定位链表:Node locationNode(int index);
 * 遍历链表:void display(Node head);
 * @version 1.0
 * @author Administrator
 *
 */
public class DoubleLink {
	
	//存入的基本元素是链表
	public Node node;
	
	public DoubleLink(Node node){
		this.node = node;
	}

	/**
	 * 追加链表:void addNode(Node node);
	 * @return 
	 * @param Node node
	 */	
	public void addNode(Node node){
		//拿到头节点
		Node head = this.node;
		
		//找到尾部
		while(head.hasNext()){
			head = head.next;
		}
		
		//添加操作
		node.pre = head;
		node.next = head.next;
		head.next = node;
		
	}
	
	
	/**
	 * 插入节点:void insertNode(Node node);
	 */
	public void insertNode(int i, Node node){
		
		//定位i位置是否存在
		Node p = this.locationNode(i);
		
		//节点不存在
		if(p == null){
			System.out.println("添加失败:下标错误或者没有找到");
			return;
		}
		
		//节点被找到
		node.pre = p.pre;
		node.next = p;
		p.pre.next = node;
		p.pre = node;
		
	}
	
	/**
	 * 删除链表:void delNode(Node node);
	 */
	public void delNode(Node node){
		Node n = this.node;
		if(findNode(node))
		{
			//node.next.pre=node.pre;
			node.pre.next = node.next;
		}else
		{
			System.out.println("节点没找到,无法删除");
			return ;
		}
	}
	
	/**
	 * 查询链表(boolean):boolean findNode(Node node);
	 */
	public boolean findNode(Node node){
		
		Node head1=this.node;
		while(head1.hasNext())
		{
			if(head1.next.equals(node))
			{
				System.out.println(node.o);
				return true;
			}
			head1=head1.next;
		}
		
		return false;
	}
	
	/**
	 * 定位链表:Node locationNode(int index);
	 */
	public Node locationNode(int index){
		int i = 0;
		
		Node head = this.node;
		
		//判断给定序号是否正确
		if(index < 0 || index > this.len()){
			System.out.println("给定的序号不合法");
			return new Node("");
		}
		
		//遍历
		while(head.hasNext()){
			
			i++;
			
			head = head.next;
			
			if(i == index){
				return head;
			}
					
		}
		return null;
	}
	
	/**
	 *  遍历链表:void display(Node head);
	 */
	public void display(){
		Node head = this.node;
		
		while(head != null){
			//System.out.println("插入成功");
			System.out.println(head.o);
			
			head = head.next;
		}
	}
	
	/**
	 * 计算链表的长度:头节点为第0位
	 */
	public int len(){
		Node head = this.node;
		
		int len = 0;
		
		while(head.hasNext()){
			len++;
			head = head.next;
		}
		
		return len;
	}
	
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值