数据结构4:简单实现循环双链表

代码不全只是自己记录学习,借鉴:https://blog.csdn.net/javazejian/article/details/52953190;强烈推荐此大神博客。。。


package com.zejian.structures.LinkedList.MyLinked;

import sun.security.pkcs11.Secmod;

/**
 * 循环链表的实现类  头结点为空
 * @param <T>
 */
public class LoopLinkedList<T> implements ILinkedList<T> {

    //不带数据的头结点
    private DNode<T> head;

    //初始化头结点
    public LoopLinkedList() {

        //生成一个自关联的空节点
        this.head=new DNode<T>();
        this.head.next=this.head;
        this.head.pre=this.head;

    }

    @Override
    public boolean isEmpty() {
        return this.head.next==head;//循环双链表的后继指针指向自己说明是空链表
    }

    @Override
    public int length() {
        int length=0;
        DNode<T> p=this.head.next;
        while (p!=this.head){
            length++;
            p=p.next;
        }
        return length;
    }


    /**
     * 获取数据
     * @param index
     * @return
     */
    @Override
    public T get(int index) {
        DNode<T> head = this.head;
        int length = length();

        if (index<0){
            return null;
        }
        int j=0;
        while (j<index&&head.next!=null){

            head=head.next;

            j++;
        }


        return head.data;
    }

    @Override
    public T set(int index, T data) {
        return null;
    }


    /**
     * 根据index插入
     * 循环链表中无论是prev还是next都不存在空的情况,因此添加时
     * 无论是头部还是尾部还是中,都视为一种情况对待
     * @param index
     * @param data
     * @return
     */
    @Override
    public boolean add(int index, T data) {
        //判定异常
        int length = length();
        if(data==null||index<0||index>=length){
            return false;
        }

        //添加数据
        DNode<T> font = this.head;//头结点数据
        int j=0;
        while (font.next!=null&&j<index){//查找插入点位置

            j++;
            font=font.next;
        }

        //创建插入点  指针指向设置  通过构造方法  已有节点——》新节点
        DNode<T> p = new DNode<>(data, font, font.next);  //插入第一个值是font 和font.next是一个对象
        System.out.println(font==font.next);//true

        //指针指向设置   新节点——》已有节点
        font.next=p;

        font.next.pre=p;


        return true;
    }

    /**
     * 从尾部插入
     * @param data
     * @return
     */
    @Override
    public boolean add(T data) {
        int length = length();

        int j=0;

        DNode<T> font = this.head;

        while (j<length){


            font=font.next;
            j++;
        }

        //创建数据 设置指针
        DNode<T> p = new DNode<>(data, font, this.head);


        font.next=p;
        this.head.pre=p;


        return true;
    }


    /**
     * 删除数据
     * @param index
     * @return
     */
    @Override
    public T remove(int index) {

        T move=null;

        int length = length();

        if (index<0||index>=length){//数组越界
            return move;
        }

        DNode<T> font = this.head;

        int j=0;

        while (j<index&&font.next!=head){

            font=font.next;
            j++;

        }

        if (font!=head){//font是第一个数据的话,数据会剩一个自连接的空字符串

            font.pre.next=font.next;
            font.next.pre=font.pre;
            move=font.data;
        }


        return move;
    }

    @Override
    public boolean removeAll(T data) {
        return false;
    }

    @Override
    public void clear() {

    }

    @Override
    public boolean contains(T data) {
        return false;
    }


    public static void main(String[] args) {
        LoopLinkedList<String> loop=new LoopLinkedList<>();

        loop.add(0,"1");
//        loop.add("2");
//        loop.add("3");
//        loop.add("4");
//
//
//        for (int i = 0; i <10 ; i++) {
//            System.out.println(loop.get(i));;
//        }

        //循环链表就实现了
        /*null
        1
        2
        3
        4
        null
        1
        2
        3
        4*/
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38788128/article/details/80914394