package com.javasc.review;

public class InitSuperList { //超级链表其实就是对常见的已有的数组结构进一步的编程,把常见的业务中需要的功能封装起来,此时就形成超级数组这个类,我们使用这个封装好的类去创建对象,那么这些对象就拥有这种属性。

//由于链表的存储结构是非连续的,那么链表的小的单元节点内,我们需要一部分的空间用来存储数据,另一部分用来保存指向下个节点的位置。

//由于链表的结构特新,我们需要维护一个头节点,依靠这个头节点去查找,操作其他位置的节点。 private InitNode head; //维护超级链表的长度 private int length;

//向超级链表的表头位置插入一个元素(头插元素)
public void addToHeader(int data){
    //如果head节点为空,表示此时链表中没有一个元素,这时只用将head节点修改即可;
    if (length == 0){
        head = new InitNode(data,null);
        length++;

    } else {
        InitNode newNode = new InitNode(data,head);
        head = newNode;
        length++;
        //这两句话可以合并为:head = new InitNode(data,head),简化代码书写方式;
    }
}
//在下标为index的下一个位置插入一个元素data;
public void addToIndexNext(int index, int data){
    if (length == 0){
        this.addToHeader(data);
    } else {
        InitNode temp = head;
        InitNode newNode = new InitNode(data,null);
        for (int i = 0; i < index; i++) {
            temp = temp.getNodeNext();
        }
        //接下来的两行的顺序不能产生错误,否则,链表会断开;
        newNode.setNodeNext(temp.getNodeNext());
        temp.setNodeNext(newNode);
        length++;

    }
}
//在下标为index的前一个元素位置插入一个元素data;
public void addToIndexFront(int index, int data){
    if (length == 0){
        this.addToHeader(data);
    } else if (index == 0){
        this.addToHeader(data);//由于index==0时,这时addToIndexNext()方法中会产生负数,这时不会移动,所以需要考虑边界问题;
    } else {
        this.addToIndexNext(index - 1,data);//合理利用已有的方法,在下标之前插入元素,等于在先寻找到下标的前一个元素,并使用此番方法;
    }
}

//在链表的表尾处插入一个元素
public void addToRear(int data){
    if (length == 0){
        this.addToHeader(data);
    } else {
        InitNode temp = head;
        InitNode newNode = new InitNode(data,null);
        for (int i = 0; i < length - 1; i++) {
            temp = temp.getNodeNext();
        }
        temp.setNodeNext(newNode);
        length++;
    }
}
//链表的元素从大到小排序,或者链表的元素从小到大排序,
public void sort(int flag){
    //可以选则排序的方式,flag为标志位,为0则为从小到大排序,为1则为从大到小排序
    if (flag == 0){
        InitNode temp = head;
        int num = 0;
        for (int i = 0; i < length - 1; i++) {
            for (int j = 0; j < length - i - 1; j++) {
                if (temp.getData() > temp.getNodeNext().getData()){
                    num = temp.getData();
                    temp.setData(temp.getNodeNext().getData());
                    temp.getNodeNext().setData(num);
                }
                temp = temp.getNodeNext();
            }
            temp = head;
        }
    } else if (flag == 1){
        InitNode temp = head;
        int num = 0;
        for (int i = 0; i < length - 1; i++) {
            for (int j = 0; j < length - i - 1; j++) {
                if (temp.getData() < temp.getNodeNext().getData()){
                    num = temp.getData();
                    temp.setData(temp.getNodeNext().getData());
                    temp.getNodeNext().setData(num);
                }
                //(重点!)在内循环中,不能让其一直的下后移动,会产生空指针异常的问题,这时候,当我们一轮比较完成之后,应当让temp重新指向head;
                temp = temp.getNodeNext();
            }
            temp = head;
        }
    } else {
        System.out.println("输入无效");
    }
}
//删除链表指定位置的元素,或者数据
public void delInex(int index){
    if(length == 0){
        System.out.println("链表中已没有元素可以删除!");
    } else if (index == 0){
        head = head.getNodeNext();
        length--;
    } else{
        InitNode temp = head;
        for (int i = 0; i < index - 1; i++) {
            temp = temp.getNodeNext();
        }
        temp.setNodeNext(temp.getNodeNext().getNodeNext());
        length--;
    }
}

//查找指定位置的元素是多少,传入查找位置的下标
public Integer select(int index){
    if(index >= 0 && index < length){
        InitNode temp = head;
        for (int i = 0; i < index ; i++) {
            temp = temp.getNodeNext();

        }
        return temp.getData();
    }
    return null;
}

public static void main(String[] args) {
    InitSuperList initSuperList = new InitSuperList();
    initSuperList.addToHeader(12);
    initSuperList.addToHeader(13);
    initSuperList.addToIndexNext(1,14);
    initSuperList.addToRear(11);
    initSuperList.addToIndexFront(0,15);
    initSuperList.delInex(4);
    initSuperList.sort(0);
    for (int i = 0; i < initSuperList.length; i++) {
        Integer value = initSuperList.select(i);
        System.out.println(value);
    }
}

}