zoukankan      html  css  js  c++  java
  • 【数据结构】双向循环链表 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谢谢。
  • 相关阅读:
    实验十一 集合
    实验十 泛型程序设计技术
    实验九 异常、断言与日志
    实验六 接口的定义与使用
    实验七 继承附加实验
    实验六 继承定义与使用
    《面向对象程序设计(Java)》第四周学习总结
    实验三 Java基本程序设计(2)
    201771010112罗松《面向对象程序设计(java)》第十一周学习总结
    201771010112罗松《面向对象程序设计(java)》第十周学习总结
  • 原文地址:https://www.cnblogs.com/Yunrui-blogs/p/12694021.html
Copyright © 2011-2022 走看看