哨兵 双向 java_java数据结构之LinkedDeque(用链表实现的双端(即头尾两个哨兵节点)双向(node里两个指向)队列)...

packagecom.jimmy.impl;

importcom.jimmy.QueueInterf;

publicclassLinkedDequeimplementsQueueInterf {

/**

*

* @paramargs

*/

publicclassNode {

privateTdata;

//双向

publicNodenext;

publicNodepre;

publicNode(T data, Node node) {

this.data= data;

next= node;

}

publicNode(Node last, T data, Node first) {

this.data= data;

this.pre= last;

this.next= first;

}

publicT getData() {

returndata;

}

}

//双端

publicNodefirst;// 前(端)哨兵节点,这里不同与MylinkedList的做法,并没有初始化first,last对象,仅仅把它当做引用,但仍然可以理解为哨兵

publicNodelast;// 后(端)哨兵节点

publicintlength;// 有效数据长度

// |----| |-----| |----|

// | first|--> | 4 | | 5 | | 3 |

// |----| |-----| |----|

publicLinkedDeque() {

first=null;// 这里不同与MylinkedList的做法,并没有初始化first,last对象

last=null;

}

publicstaticvoidmain(String[] args) {

LinkedDeque q = newLinkedDeque();

q.addBack(4);

q.addBack(5);

q.addBack(3);

q.display();

q.removeFront();

q.removeFront();

q.display();

}

// 相当于入队(从后面)

publicvoidaddBack(T newEntry) {

Node newNode = newNode(last, newEntry,null);  //把newEntry放到last后面,即:

//newEntry.pre= last;

//newEntry.next= first;(null)

if(isEmpty())

{

first= newNode;// 仅仅把fist当做引用,所以直接赋值给first,即把newnode当做第一个first

last= newNode;

} else{

last.next= newNode;

last= newNode;

}

length++;

}

publicvoidaddFront(T newEntry) {

Node newNode = newNode(null, newEntry,first);//把newEntry放到first前面,即:

//newEntry.pre= last;(null)

//newEntry.next= first;

if(isEmpty())

{

last= newNode;// 仅仅把fist当做引用,所以直接赋值给first,即把newnode当做第一个first

} else{

first.pre= newNode;

first= newNode;

}

length++;

}

publicvoidenqueue(T newEntry) {

Node newNode = newNode(newEntry,null);

if(isEmpty())

{

first= newNode;// 仅仅把fist当做引用,所以直接赋值给first,即把newnode当做第一个first

last= newNode;

// |----|

// | first|--> | 4 |

// |----|

} else{

last.next= newNode;// 有点像C的做法

last= newNode;

}

length++;

}

//相当于出对

publicT removeFront() {

T front = null;

if(!isEmpty())

{

front = first.getData();

first=first.next;

if(first==null)

last=null;

else

first.pre=null;

}

length--;

returnfront;

}

publicT removeBack() {

T front = null;

if(!isEmpty())

{

front = first.getData();

first=first.next;

if(first==null)

last=null;

else

first.pre=null;

}

length--;

returnfront;

}

publicT dequeue() {

T front = null;

if(!isEmpty())

{

front = first.getData();

first=first.next;

}

length--;

returnfront;

}

publicT getFront() {

T front = null;

if(!isEmpty())

{

front = first.getData();

}

returnfront;

}

publicbooleanisEmpty() {

returnfirst==null;

}

publicvoidclear() {

first=null;

last=null;

}

publicintgetLength()

{

returnlength;

}

publicvoiddisplay() {

Node cur = first;// first为哨兵

while(cur !=null) {// 从一开始

// if(cur!=null)

System.out.print(cur.getData() +",");

cur = cur.next;

}

System.out.println();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值