数据结构和算法(Java版)学习笔记之双端链表(九)

双端链表

  • 双端链表:双端链表与传统链表非常相似,但双端链表并不是双向链表,只是新增了一个属性:对最后一个链结点的引用
  • 其特点是:第一个链结点与最后一个链结点直接相连:
    双端链表图示
  • 如上图所示 : 由于有着对最后一个链结点的直接引用,所以双端链表比传统链表在某些方面要方便很多,比如:在尾部插入一个链结点,双端链表可以进行直接操作;
  • 因为传统链表只能通过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 

以上就是对双端链表的简单实现~~

发布了46 篇原创文章 · 获赞 11 · 访问量 3920

猜你喜欢

转载自blog.csdn.net/qq_42197800/article/details/90085529