【数据结构】双向循环链表 Java

双向循环链表 java版

目录

下面是双向循环链表的模板,如果有需要可以拿去,也可以自己修改食用。如果您有更好的方法,可以在评论区评论,谢谢

( ̄▽ ̄)"

过程

最开始的时候,头是空的

  • head=null

1

我们申请了一个结点,结点分为三个部分

  • 前驱
  • 数据
  • 后继
class node<T>{
    T data;//数据域
    node<T>pre,next;//前驱后继
    node(T data){
        this.data=data;
    }
}
  • temp=new node(data)

2

接下来,我们把头指向这个新创建的结点,然后这个结点的前驱和后继都指向其本身

  • head=temp
  • head.next=head
  • head.pre=head

3

接下来,我们又申请了一个结点

  • new node(data)

4

这个时候,我们先把新申请的结点的后继指向head所在的结点的下一个结点,也就是temp.next=head.next,然后我们在把这个结点的前驱指向head所在的结点,然后把head所在结点的后继结点的前驱指向新创建的结点,最后head所在的结点的后继指向新创建的结点。最后head向后面移一位

  • temp.next=head.next
  • temp.pre=head
  • head.next.pre=temp
  • head.next=temp
  • head=head.next

5

完成结点连接,这样就可以创建属于你自己的双向循环链表了。

back

代码


class LinkListNode<T>{
    T data;
    LinkListNode<T> pre,next;
    LinkListNode(T data){
        this.data=data;
    }
}
//双向循环链表
public class LinkList<T> {
    private LinkListNode<T> head;
    private int length=0;

    public void add(T t){
        //容错
        if(t!=null) {

            if (head == null) {
                head = new LinkListNode<>(t);
                head.next = head;
                head.pre = head;

            } else {
                LinkListNode<T> temp = new LinkListNode<>(t);

                temp.next = head.next;
                head.next.pre = temp;
                head.next = temp;
                temp.pre = head;

                head = head.next;//保持在尾部
            }
            length++;
        }
    }
    //根据下标进行查找
    public T get(int index){
        if(index>=length||index<0) {
            return null;
        } else{
          LinkListNode<T> p=head;
          while(index--!=0){
              p=p.next;
          }
          return p.data;
        }
    }

    public T delete(){
        if(length>0) {
            LinkListNode<T> pt;

            pt=head.next;
            pt.next.pre=head;
            head.next=pt.next;
            //置空引用
            pt.next=pt.pre=null;

            length--;
            if(length==0)
                head=null;
            return pt.data;
        }
        return null;
    }
    public T delete(T data){
        //值相同就删除
        //容错
        if(data!=null) {
            int len = length;
            //根据次数判断
            while (len-- != 0) {
                if (head.data == data)
                    break;
                head = head.next;
            }
            //如果找到了
            if (head.data == data) {
                head.pre.next = head.next;
                head.next.pre = head.pre;
                //获得该节点
                LinkListNode<T> temp = head;
                head = head.next;
                //该删除节点引用置空
                temp.pre = temp.next = null;
                length--;
                if (length == 0) {
                    head = null;
                }
                return temp.data;
            }
        }
        return null;
    }

    public int getLength() {
        //获取长度
        return length;
    }

    public LinkListNode<T> getHead() {
        //获取这个头
        return head;
    }
}

back

这是小睿的博客,如果需要转载,请标注出处啦~ヾ(≧▽≦*)o谢谢。
原文地址:https://www.cnblogs.com/Yunrui-blogs/p/12694021.html