双端链表的基本操作(2):双端链表实现队列

我们知道,队列是一种“先进先出”的数据结构,队列的插入操作是在队尾进行的,而删除操作是在队头进行的,这与在双端链表的表尾插入和在表头删除操作是类似的,因此可以用双端链表实现队列。

        双端链表实现队列的Java代码:

package parking;

import java.util.Collection;
import java.util.Iterator;
import java.util.Queue;

class Node {

	Object data;
	Node next;

	public Node(Object data) {
		this.data = data;
	}

}

class LinkNode {

	private Node head;// 头结点
	private Node tail;// 尾结点
	private int size;

	public LinkNode() {
		this.head = null;
		this.tail = null;
		this.size = 0;
	}

	// 判断是否为空
	public boolean isEmpty() {
		return size == 0 ? true : false;
	}

	// 头插入法
	public void addHNode(Node node) {
		if (head == null) {
			head = node;
			tail = node;
		} else {
			node.next = head;
			head = node;
		}
		size++;
	}

	// 尾结点插入
	public void addTnode(Node node) {
		if (head == null) {
			head = node;
			tail = node;
		} else {
			tail.next = node;
			tail = node;
		}
		size++;
	}

	// 输出头结点,不删除
	public Object sysHNode() {
		if (head == null) {
			return null;
		}
		Object obj = head.data;
		return obj;
	}

	// 输出头结点,并删除
	public Object deleteHnode() {
		if (head == null) {
			return null;
		}
		Object obj = head.data;
		if (head.next == null) {
			head = null;
		} else {
			head = head.next;
		}
		size--;
		return obj;
	}

	// 输出尾结点,并删除
	public Object deleteTnode() {
		if (head == null) {
			return null;
		}
		Object obj = tail.data;
		if (head == tail) {
			head = null;
			tail = null;
		} else {
			Node temp = head;
			Node pre = null;// 前一个结点
			while (temp != tail) {
				pre = temp;
				temp = temp.next;
			}
			pre.next = null;
			tail = pre;
		}
		size--;
		return obj;
	}

	// 输出链表
	public void sysNode() {
		if (head == null) {
			System.out.println("链表为空");
			return;
		}
		Node temp = head;
		while (temp != null) {
			System.out.print(temp.data + "-->");
			temp = temp.next;
		}
		System.out.println();
	}

	// 获取链表大小
	public int getSize() {
		// TODO Auto-generated method stub
		return size;
	}

}

public class LinkQueue {

	private LinkNode link;

	public LinkQueue() {
		this.link = new LinkNode();
	}

	// 获取队列大小
	private int getSize() {
		return link.getSize();
	}

	// 判断队列是否为空
	private boolean isEmpty() {
		return link.isEmpty();
	}

	// 入队,尾结点插入
	private void add(Object obj) {
		link.addHNode(new Node(obj));
	}

	// 出队,在链表头结点删除元素
	private Object poll() {
		if (this.isEmpty()) {
			return null;
		}
		return link.deleteHnode();
	}

	// 输出队列元素
	private void sysQueue() {
		link.sysNode();
	}

	public static void main(String[] args) {

		LinkQueue queue = new LinkQueue();
		int i;
		for (i = 0; i < 5; i++) {
			queue.add(i);
		}
		System.out.println("队列元素大小--》" + queue.getSize());
		queue.sysQueue();
		System.out.println("出队元素--》" + queue.poll());
		queue.sysQueue();
		System.out.println("队列元素大小--》" + queue.getSize());

	}

}

效果:

队列元素大小--》5
4-->3-->2-->1-->0-->
出队元素--》4
3-->2-->1-->0-->
队列元素大小--》4

 我的座右铭:不会,我可以学;落后,我可以追赶;跌倒,我可以站起来;我一定行。  

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
/* * 基于双向链表实现双端队列结构 */ package dsa; public class Deque_DLNode implements Deque { protected DLNode header;//指向节点(哨兵) protected DLNode trailer;//指向尾节点(哨兵) protected int size;//队列中元素的数目 //构造函数 public Deque_DLNode() { header = new DLNode(); trailer = new DLNode(); header.setNext(trailer); trailer.setPrev(header); size = 0; } //返回队列中元素数目 public int getSize() { return size; } //判断队列是否为空 public boolean isEmpty() { return (0 == size) ? true : false; } //取首元素(但不删除) public Object first() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); return header.getNext().getElem(); } //取末元素(但不删除) public Object last() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); return trailer.getPrev().getElem(); } //在队列前端插入新节点 public void insertFirst(Object obj) { DLNode second = header.getNext(); DLNode first = new DLNode(obj, header, second); second.setPrev(first); header.setNext(first); size++; } //在队列后端插入新节点 public void insertLast(Object obj) { DLNode second = trailer.getPrev(); DLNode first = new DLNode(obj, second, trailer); second.setNext(first); trailer.setPrev(first); size++; } //删除首节点 public Object removeFirst() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); DLNode first = header.getNext(); DLNode second = first.getNext(); Object obj = first.getElem(); header.setNext(second); second.setPrev(header); size--; return(obj); } //删除末节点 public Object removeLast() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); DLNode first = trailer.getPrev(); DLNode second = first.getPrev(); Object obj = first.getElem(); trailer.setPrev(second); second.setNext(trailer); size--; return(obj); } //遍历 public void Traversal() { DLNode p = header.getNext(); while (p != trailer) { System.out.print(p.getElem()+" "); p = p.getNex

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灰太狼_cxh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值