Java双端链表解释与实现

10 篇文章 0 订阅

双端链表和传统链表既有相似又有不同,相同点都是通过修改后继指针来添加新结点,但是在此之上,双端链表又加入了一个新的功能,它允许链表的最后一个结点像头结点一样,可以进行直接插入操作。不需要遍历整个链表,效率更高。

举例:



public class link {


public static void main(String[] args) {
// TODO Auto-generated method stub
FLList flList=new FLList();
flList.insertFirst(50);
flList.insertFirst(40);
flList.insertLast(45);
flList.displayList();
flList.deleteFirst();
flList.displayList();
}
}
class Link3{
public long dDate;
public Link3 next;
public Link3(long d){
dDate=d;
}
public void displayLink(){
System.out.println(dDate+" ");
}
}
class FLList{
private Link3 first;
private Link3 last;
public FLList(){
first=null;
last=null;
}
public boolean isEmpty(){
return first==null;
}
public void insertFirst(long dd){  //这里是插入初始结点;
Link3 newLink=new Link3(dd);
if(isEmpty())
last = newLink;
else
newLink.next = first;
first=newLink;
}
public void insertLast(long dd){
Link3 newLink= new Link3(dd);
if(isEmpty())
first=newLink;
else
last.next=newLink;
last=newLink;
}
public long deleteFirst(){
long temp=first.dDate;
if(first.next==null)
last=null;
else
first=first.next;
return temp;
}
public void displayList(){
System.out.println("Link (first->last): ");
Link3 current=first;
while(current!=null){
current.displayLink();
current=current.next;
}
System.out.println(" ");
}
}




输出:

Link (first->last): 

40 
50 
45 
 
Link (first->last): 
50 
45 
/* * 基于双向链表实现双端队列结构 */ 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
发出的红包

打赏作者

Evan9603

知识付费

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

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

打赏作者

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

抵扣说明:

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

余额充值