数据结构与算法(五)

本文详细介绍了双端链表和双向链表的概念及操作方法,包括从头部和尾部进行插入、删除等基本操作,并提供了具体的实现代码。

双端链表和双向链表


一. 双端链表


1. 什么是双端链表

链表中保存着对最后一个链结点的引用的链表


2. 从头部进行插入

要对链表进行判断,如果为空则设置尾结点为新添加的结点。


3. 从尾部进行插入

如果链表为空,则直接设置头结点为新添加的结点,否则设置尾结点的后一个结点为新添加的结点。


4. 从头部进行删除

判断头结点是否有下一个结点,如果没有则设置尾结点为null


链结点

/*
 * 链结点,相当于是车厢
 */
public class Node {
	//数据域:保存结点里的数据
	public long data;
	//结点域==指针域:保存下一个结点的引用
	public Node next;
	
	public Node(long value){
		this.data=value;
	}
	
	/*
	 * 显示方法
	 */
	public void display(){
		System.out.print(data+" ");
	}

}


双端链表

/*
 * 双端链表
 */
public class FirstLastLinkList {
	//头结点
	private Node first;
	//尾结点
	private Node last;
	
	public FirstLastLinkList(){
		first=null;
		last=null;
	}
	/*
	 * 插入一个结点,在头结点后进行插入
	 */
	public void insertFirst(long value){ 
		Node node=new Node(value);
		if(isEmpty()){
			last=node;
		}
			node.next=first;
			first=node;
		
	}
	/*
	 * 插入一个结点,从尾结点进行插入
	 */
	public void insertLast(long value){
		Node node=new Node(value);
		if(isEmpty()){
			first=node;
		}else{
			last.next=node;
		}
		last=node;
	}
	/*
	 * 删除一个结点,在头结点后进行删除
	 */
	public Node deleteFirst(){
		Node tmp=first;
		if(first.next==null){
			last=null;
		}
		first=tmp.next;
		return tmp;
	}
	/*
	 * 显示方法
	 */
	public void display(){
		Node current=first;
		while(current!=null){
			current.display();
			current=current.next;
		}
		System.out.println();
	}
	/*
	 * 查找方法
	 */
	public Node find(long value){
		Node current=first;
		while(current.data!=value){
			if(current.next==null){
				return null;
			}
			current=current.next;
		}
		return current;
	}
	/*
	 * 删除方法,根据数据域进行删除
	 */
	public Node delete(long value){
		Node current=first;
		Node previous=first;
		while(current.data!=value){
			if(current.next==null){
				return null;
			}
			previous=current;
			current=current.next;
		}
		if(current==first){
			first=first.next;
		}else{
			previous.next=current.next;
		}
		return current;
		
	}
	/*
	 * 判断是否为空
	 */
	public boolean isEmpty(){
		return (first==null);
	}
}

测试:

public class TestFirstLastLinkList {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FirstLastLinkList fl=new FirstLastLinkList();
		fl.insertFirst(34);
		fl.insertFirst(56);
		fl.insertFirst(67);
//		fl.insertFirst(76);
//		fl.display();
//		
//		fl.deleteFirst();
//		fl.deleteFirst();
//		fl.display();
		
		fl.insertLast(56);
		fl.insertLast(90);
		fl.insertLast(12);
		
		fl.display();
		

	}

}

二. 双向链表


1. 什么是双向链表

每个结点除了保存了对下一个结点的引用,同时还保存着对前一个结点的引用。


2. 从头部进行插入

要对链表进行判断,如果为空则设置尾结点为新添加的结点。如果不为空,还需要设置头结点的前一个结点为新添加的结点。


3. 从尾部进行插入

如果链表为空,则直接设置头结点为新添加的结点,否则设置尾结点的后一个结点为新添加的结点。同时设置新添加的结点的前一个结点为尾结点。


4. 从头部进行删除

判断头结点是否有下一个结点,如果没有则设置尾结点为null。否则设置头结点的下一个结点的previous为null。


5. 从尾部进行删除

如果头结点没有其他结点,则设置尾结点为null。否则设置尾结点前一个结点的next为null。设置尾结点为其前一个结点。


6. 删除方法

不需要再使用一个零时的指针域。


链结点

/*
 * 链结点,相当于是车厢
 */
public class Node {
	//数据域
	public long data;
	//结点域==指针域
	public Node next;
	public Node previous;
	
	public Node(long value){
		this.data=value;
	}
	
	/*
	 * 显示方法
	 */
	public void display(){
		System.out.print(data+" ");
	}

}

双向链表

/*
 * 双向链表
 */
public class DoubleLinkList {
	//头结点
	private Node first;
	//尾结点
	private Node last;
	
	public DoubleLinkList(){
		first=null;
		last=null;
	}
	/*
	 * 插入一个结点,在头结点后进行插入
	 */
	public void insertFirst(long value){
		Node node=new Node(value);
		if(isEmpty()){
			last=node;
		}else{
			first.previous=node;
		}
			node.next=first;
			first=node;
		
	}
	/*
	 * 插入一个结点,从尾结点进行插入
	 */
	public void insertLast(long value){
		Node node=new Node(value);
		if(isEmpty()){
			first=node;
		}else{
			last.next=node;
			node.previous=last;
		}
		last=node;
	}
	/*
	 * 删除一个结点,在头结点后进行删除
	 */
	public Node deleteFirst(){
		Node tmp=first;
		if(first.next==null){
			last=null;
		}else{
			first.next.previous=null;
		}
		first=tmp.next;
		return tmp;
	}
	/*
	 * 删除结点,从尾部进行删除
	 */
	public Node deleteLast(){
		Node tmp=last;
		if(first.next==null){
			first=null;
		}else{
			last.previous.next=null;
			
		}
		last=tmp.previous;
		return tmp;
	}
	/*
	 * 显示方法
	 */
	public void display(){
		Node current=first;
		while(current!=null){
			current.display();
			current=current.next;
		}
		System.out.println();
	}
	/*
	 * 查找方法
	 */
	public Node find(long value){
		Node current=first;
		while(current.data!=value){
			if(current.next==null){
				return null;
			}
			current=current.next;
		}
		return current;
	}
	/*
	 * 删除方法,根据数据域进行删除
	 */
	public Node delete(long value){
		Node current=first;
		while(current.data!=value){
			if(current.next==null){
				return null;
			}
			current=current.next;
		}
		if(current==first){
			first=first.next;
		}else{
			current.previous.next=current.next;
		}
		return current;
		
	}
	/*
	 * 判断是否为空
	 */
	public boolean isEmpty(){
		return (first==null);
	}
}

测试:

public class TestDoubleLinkList {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		DoubleLinkList dl=new DoubleLinkList();
		dl.insertLast(45);
		dl.insertLast(56);
		dl.insertLast(90);
		dl.display();
		
//		
//		dl.deleteLast();
//		dl.display();
		
		while(!dl.isEmpty()){
			//dl.deleteLast();
			dl.deleteFirst();
			dl.display();
		}

	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值