双端链表
- 双端链表:双端链表与传统链表非常相似,但双端链表并不是双向链表,只是新增了一个属性:
对最后一个链结点的引用。 - 其特点是:第一个链结点与最后一个链结点直接相连:
- 如上图所示 : 由于有着对最后一个链结点的直接引用,所以双端链表比传统链表在某些方面要方便很多,比如:在尾部插入一个链结点,双端链表可以进行直接操作;
- 因为传统链表只能通过next节点循环找到最后链结点操作,但双端链表可以直接对尾结点进行操作,所以双端链表适合制造队列。
双端链表Java代码实现
接下来对双端链表实现头部插入和尾部插入,因为头部插入和单链表一样,所以不多说;下面看一下尾部插入next指向的图示:
-
从头部进行插入
链表中保存着对最后一个链结点引用的链表。
-
从尾部进行插入
要对链表进行判断,如果为空则设置尾结点为新添加的结点。
-
从头部进行删除
判断头结点是否有下一个结点,如果没有则设置结点为null
-
好处:因为保留了对最后一个结点的引用,方便在最后进行结点的插入操作。
但使用双端链表也并不有助于删除最后一个结点。
-
代码实现:
先创建结点类LinkNode:
public class LinkNode {
public long dData; //存放数据
public LinkNode next;
public LinkNode(long d){
dData = d;
}
//显示结点数据
public void displayLink(){
System.out.print(dData + " ");
}
}
其次创建对双端链表进行插入、删除、显示方法的实现:
public class DoubleLinkList{
public LinkNode first;
public LinkNode last;
public FirstLastList(){
first = null;
last = null;
}
//为空判断
public boolean isEmpty(){
return first == null;
}
//头插
public void insertFirst(long dd){
LinkNode newLink = new LinkNode(dd);
if(isEmpty()){
last = newLink;
}else{
newLink.next = first;
}
first = newLink;
}
//尾插
public void insertLast(long dd){
LinkNode newLink = new LinkNode(dd);
if(isEmpty()){
first = newLink;
}else{
last.next = newLink;
}
last = newLink;
}
//删除
public long deleteFirst(){
long temp = first.dData;
if(first.next == null){
last = null;
}else{
first = first.next;
}
return temp;
}
//显示所有
public void displayList(){
System.out.println("list(fitst -> last):");
LinkNode current = first;
while(current != null){
current.displayLink();
current = current.next;
}
System.out.println();
}
}
最后进行方法测试:
public class DoubleLinkListApp{
public static void main(String[] args){
DoubleLinkList theList = new DoubleLinkList();
//头插
theList.insertFirst(2);
theList.insertFirst(4);
theList.insertFirst(6);
//尾插
theList.insertLast(1);
theList.insertLast(3);
theList.insertLast(5);
theList.displayList();
//删除
theList.deleteFirst();
theList.deleteFirst();
theList.displayList();
}
}
结果为:
run:
list(fitst -> last):
6 4 2 1 3 5
list(fitst -> last):
2 1 3 5
以上就是对双端链表的简单实现~~