双向链表

1.双端链表
1.1内部实现

package Doublelist;
//双端链表,(相比单链表,多个尾节点与首节点的链接引用)
public class DoubleLinklist {
     private Node first;// 首个链接点,相当于车头
     private Node last;  // 尾部链接点
     public DoubleLinklist() {
    	 first = null; //其链默认指向null
     }
     //判断是否为空
     public boolean isEmpty() {
    	 return (first==null);
     }
     //在头节点后插入一个节点
     public void insertfirst(long value) {
    	 Node curr = new Node(value);
    	 if(isEmpty()){//判断是否为插入的第一个节点
    		 last = curr;//第一个节点为尾节点
    	 } 
    	 curr.next = first;  //插入节点指向首节点指向的节点
    	 first = curr;       //首节点指向插入节点first = curr.next表示指向curr的下一个
     }
     //从尾节点后插入一个节点
     public void insertlast(long value) {
    	 Node curr = new Node(value);
//    	 Node curr = last;
//     	 Node selast = last;
    	 if(isEmpty()) {
    		 first =curr;
    	 }else {
    		 last.next = curr;
    	 }
    	 last = curr; 
     }
     //在头节点后删除一个节点
    public Node removefirst() {
    	if(first.next==null) //判断后面有么有节点
    		{
    		last = null;
    	}
    	Node temp = first;  //定义当前节点
    	first = temp.next;  //直接跳过first.next,从而指向第三个节点
    	return temp;
    }
    //显示链表
    public void display1() {
    	Node curr = first;
    	while(curr != null) //判断当前有元素存在
    	{
    		curr.display();  //调用Node里面的显示方法
    		curr = curr.next;//继续遍历下个节点
    	}
    	System.out.println();
    }
    //查找链节点
    public  Node  find(long value) {
    	Node curr = first;
    	while(curr.data!=value) {
    		if(curr.next==null) {
    			return null;
    		}
    		curr = curr.next;
    	}
    	return curr;		
    }
    //删除节点
    public Node delete(long value) {
    	Node curr = first;
    	Node prev = first;
    	while(curr.data!=value) {
    		if(curr.next==null) {
    			return null;
    		}
    		prev = curr;     //之前的要指向当前的链接点
    		curr = curr.next;//当前的链接点要指向下一个
    		if(curr==first) //判断删除节点是否为首节点
    		{
    			first = first.next;
    			}
    		else {
    				prev.next = curr.next; //删除当前的节点prev(prev.next)》curr(curr.next)》node
    			}
    	}
    	return curr;
    }
}

2.双向链表:即手牵手的形式,每个元素均知道自己前后的链接点

2.1链表定义

package Doublelist;
//链节点,有数据域和指针域构成
public class Node {
   public long data; //数据域
   public Node next; //后指针域
   public Node prev; //前指针域

   public Node(long value) {
	   this.data = value;
   }
   public void display() {
	   System.out.print(data+" ");
   }
}

2.2内部功能实现

package Doublelist;
//双向链表,(相互链接,可以知道自己前后链接的元素)
public class Doublelist {
     private Node first;// 首个链接点,相当于车头
     private Node last;  // 尾部链接点
     public Doublelist() {
    	 first = null; //其链默认指向null
     }
     //判断是否为空
     public boolean isEmpty() {
    	 return (first==null);
     }
     //在头节点后(第一个节点前)插入一个节点
     public void insertfirst(long value) {
    	 Node curr = new Node(value);
    	 if(isEmpty()){//判断是否为插入的第一个节点
    		 last = curr;//第一个节点为尾节点
    	 } else {
    		 first.prev = curr;//相当于每次在第一个节点前面插入节点(头节点+第一个节点)
    	 }
    	 curr.next = first;  //插入节点指向首节点指向的节点
    	 first = curr;       //进行第一个节点更新
     }
     //从尾节点后插入一个节点 
     public void insertlast(long value) {
    	 Node curr = new Node(value);
    	 if(isEmpty()) {
    		 first =curr;//设置头节点为新添加节点
    	 }else {
    		 last.next = curr;  //尾节点后面的为新添加节点
    		 curr.prev = last;  //新添加节点的前面节点为尾节点  
    	 }
    	 last = curr; //进行最后节点的更新
     }
     //在头节点后删除一个节点
    public Node removefirst() {
    	Node temp = first;   //定义当前节点
    	if(first == null) {
    		return null;
    	}
    	if(first.next==null) //判断头节点后面有没有节点
    		{
    		last = null;     //直接删除最后一个节点
    	}else { 
    		first.next.prev =null;	//头节点的下个节点前面为空
    	}
    	first = temp.next;  //直接跳过first.next,从而指向第三个节点
    	return temp;
    }
    //从尾节点前面进行删除节点
    public Node removelast() {
    	Node temp = last;
    	if(first.next==null) //判断头节点后面有没有节点
		{
		first = null;     //无,将头节点置空
	}else { 
		last.prev.next =null;	//删除最后一个节点
		last = temp.prev;   //最后节点进行更新
	}
    	return temp;         
    }
    //显示链表
    public void display1() {
    	Node curr = first;
    	while(curr != null) //判断当前有元素存在
    	{
    		curr.display();  //调用Node里面的显示方法
    		curr = curr.next;//继续遍历下个节点
    	}
    	System.out.println();
    }
    //查找链节点
    public  Node  find(long value) {
    	Node curr = first;
    	while(curr.data!=value) {
    		if(curr.next==null) {
    			return null;
    		}
    		curr = curr.next; //继续遍历下个节点
    	}
    	return curr;	//找到返回当前节点	
    }
    //删除节点
    public Node delete(long value) {
    	Node curr = first;
    	while(curr.data!=value) {
    		if(curr.next==null) {
    			return null;
    		}
    	}
    		if(curr==first) //判断删除节点是否为首节点
    		{
    			first = first.next; //跳过第一个节点,即删除当前第一个节点
    			}
    		else {
    				curr.prev.next = curr.next; //删除当前的节点prev(prev.next)》curr(curr.next)》node
    			}
    		curr = curr.next;//当前的链接点要指向下一个
    	
    	return curr;
    }
}

2.3双向链表测试代码

package Doublelist;

public class TestDoublelist {
public static void main(String[] args) {
	Doublelist t1 = new Doublelist();
	//从尾部插入节点
	t1.insertlast(25);
	t1.insertlast(34);
	t1.insertlast(12);
	t1.insertlast(48);
	t1.display1();
	//从尾部删除节点,留一个
    while(!t1.isEmpty()) {
    	t1.removelast();
    	t1.display1();
    }
    //从头部插入节点
    t1.insertfirst(48);
    t1.insertfirst(25);
    t1.insertfirst(36);
	t1.display1();
	//从头部删除节点
	t1.removefirst();
	t1.display1();
	//删除指定元素
	t1.delete(25);
	t1.display1();
	System.out.println("----end---");
	
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值