容器-------LinkedList(链表)

本文通过自定义一个链表,详细介绍了链表的基础结构,包括get方法的实现、remove方法的添加以及如何插入节点。同时,还探讨了使用泛型对链表进行封装,以增强其灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义一个链表,体会底层原理

基础结构
public class JtLinkedList01 {
    private Node first;
    private Node last;
    private  int size;
    //[]
    //["a","b","c"]
    public void add(Object object){
        Node node = new Node(object);
        if (first==null){
//            node.previous =null;
//            node.next = null;
            first = node;
            last = node;
        }else {
            node.previous = last;
            node.next = null;
            last.next = node;
            last = node;
        }
    }

@Override
public String toString() {
    StringBuilder stringBuilder = new StringBuilder("[");
    Node temp = first;
    while (temp!=null){
        stringBuilder.append(temp.element+",");
        temp = temp.next;
    }
    stringBuilder.setCharAt(stringBuilder.length()-1,']');
    return stringBuilder.toString();
}

public static void main(String[] args) {
    JtLinkedList01 jtLinkedList01 = new JtLinkedList01();
    jtLinkedList01.add("a");
    jtLinkedList01.add("b");
    jtLinkedList01.add("c");
    jtLinkedList01.add("c");
    jtLinkedList01.add("c");
    jtLinkedList01.add("c");
    System.out.println(jtLinkedList01);
  }
}
增加get方法
public class JtLinkedList02 {
    private Node first;
    private Node last;
    private  int size;
    public Object get(int index){
        if (index <0||index>size-1){
            throw new RuntimeException("索引数字不合法"+index);
        }
        Node temp = null;
        if (index<=(size>>1)){ //size>>1相当于除以2
            temp = first;
            for (int i = 0;i<index;i++){
                temp = temp.next;
            }
        }else {
            temp = last;
            for (int i  = size-1;i >index;i-- ){
                temp = temp.previous;
            }
        }
        return temp.element;
    }
    //[]
    //["a","b","c"]
    public void add(Object object){
        Node node = new Node(object);
        if (first==null){
//            node.previous =null;
//            node.next = null;
            first = node;
            last = node;
        }else {
            node.previous = last;
            node.next = null;
            last.next = node;
            last = node;
        }
        size++;
    }

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder("[");
        Node temp = first;
        while (temp!=null){
            stringBuilder.append(temp.element+",");
            temp = temp.next;
        }
        stringBuilder.setCharAt(stringBuilder.length()-1,']');
        return stringBuilder.toString();
    }

    public static void main(String[] args) {
        JtLinkedList02 jtLinkedList02 = new JtLinkedList02();
        jtLinkedList02.add("a");
        jtLinkedList02.add("b");
        jtLinkedList02.add("c");
        jtLinkedList02.add("d");
        jtLinkedList02.add("e");
        jtLinkedList02.add("f");
        System.out.println(jtLinkedList02);
        System.out.println(jtLinkedList02.get(1));
    }
}
增加remove方法
public class JtLinkedList03 {
    private Node first;
    private Node last;
    private  int size;
    public void remove(int index) {
        Node temp = getNode(index);
        if (temp != null) {
            Node up = temp.previous;
            Node down = temp.next;
            if (up != null) {
                up.next = down;
            }
            if (down != null) {
                down.previous = up;
            }
            //被删除的元素是第一个
            if (index==0){
                first = down;
            }
            //被删除的元素是最后一个
            if (index==size-1){
                last = up;
            }
            size--;
        }
    }
    public Object get(int index){
        if (index <0||index>size-1){
            throw new RuntimeException("索引数字不合法"+index);
        }
        Node temp = getNode(index);
        return temp!=null?temp.element:null;
    }
    public Node getNode(int index){
        Node temp = null;
        if (index<=(size>>1)){ //size>>1相当于除以2
            temp = first;
            for (int i = 0;i<index;i++){
                temp = temp.next;
            }
        }else {
            temp = last;
            for (int i  = size-1;i >index;i-- ){
                temp = temp.previous;
            }
        }
        return temp;
    }

    //[]
    //["a","b","c"]
    public void add(Object object){
        Node node = new Node(object);
        if (first==null){
//            node.previous =null;
//            node.next = null;
            first = node;
            last = node;
        }else {
            node.previous = last;
            node.next = null;
            last.next = node;
            last = node;
        }
        size++;
    }

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder("[");
        Node temp = first;
        while (temp!=null){
            stringBuilder.append(temp.element+",");
            temp = temp.next;
        }
        stringBuilder.setCharAt(stringBuilder.length()-1,']');
        return stringBuilder.toString();
    }

    public static void main(String[] args) {
        JtLinkedList03 jtLinkedList03 = new JtLinkedList03();
        jtLinkedList03.add("a");
        jtLinkedList03.add("b");
        jtLinkedList03.add("c");
        jtLinkedList03.add("d");
        jtLinkedList03.add("e");
        jtLinkedList03.add("f");
        System.out.println(jtLinkedList03);
        jtLinkedList03.remove(3);
        System.out.println(jtLinkedList03);
        System.out.println(jtLinkedList03.get(1));
        jtLinkedList03.remove(0);
        System.out.println(jtLinkedList03);
        jtLinkedList03.remove(3);
        System.out.println(jtLinkedList03);
    }
}
插入节点
public class JtLinkedList04 {
    private Node first;
    private Node last;
    private int size;

    public void add(int index, Object object) {
        Node temp = getNode(index);
        Node newNode = new Node(object);
        Node up = temp.previous;
        if (temp != null) {
            if (0<index&&index<size-1) {
                up.next = newNode;
                newNode.previous = up;
                newNode.next = temp;
                temp.previous = newNode;
            }
            if (index == 0) {
                first = newNode;
                newNode.previous = null;
                newNode.next = temp;
                temp.previous = newNode;
            }
            if (index == size-1){
                last = newNode;
                newNode.previous = temp.next;
                newNode.next = null;
                temp.next = newNode;
            }
            if (index<0||index>size){
                throw new RuntimeException("索引数字不合法"+index);
            }
            size++;
        }
    }

    public void remove(int index) {
        Node temp = getNode(index);
        if (temp != null) {
            Node up = temp.previous;
            Node down = temp.next;
            if (up != null) {
                up.next = down;
            }
            if (down != null) {
                down.previous = up;
            }
            //被删除的元素是第一个
            if (index == 0) {
                first = down;
            }
            //被删除的元素是最后一个
            if (index == size - 1) {
                last = up;
            }
            size--;
        }
    }

    public Object get(int index) {
        if (index < 0 || index > size - 1) {
            throw new RuntimeException("索引数字不合法" + index);
        }
        Node temp = getNode(index);
        return temp != null ? temp.element : null;
    }

    public Node getNode(int index) {
        Node temp = null;
        if (index <= (size >> 1)) { //size>>1相当于除以2
            temp = first;
            for (int i = 0; i < index; i++) {
                temp = temp.next;
            }
        } else {
            temp = last;
            for (int i = size - 1; i > index; i--) {
                temp = temp.previous;
            }
        }
        return temp;
    }

    //[]
    //["a","b","c"]
    public void add(Object object) {
        Node node = new Node(object);
        if (first == null) {
//            node.previous =null;
//            node.next = null;
            first = node;
            last = node;
        } else {
            node.previous = last;
            node.next = null;
            last.next = node;
            last = node;
        }
        size++;
    }

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder("[");
        Node temp = first;
        while (temp != null) {
            stringBuilder.append(temp.element + ",");
            temp = temp.next;
        }
        stringBuilder.setCharAt(stringBuilder.length() - 1, ']');
        return stringBuilder.toString();
    }

    public static void main(String[] args) {
        JtLinkedList04 jtLinkedList04 = new JtLinkedList04();
        jtLinkedList04.add("a");
        jtLinkedList04.add("b");
        jtLinkedList04.add("c");
        jtLinkedList04.add("d");
        jtLinkedList04.add("e");
        jtLinkedList04.add("f");
        System.out.println(jtLinkedList04);
        jtLinkedList04.remove(3);
        System.out.println(jtLinkedList04);
        System.out.println(jtLinkedList04.get(1));
        jtLinkedList04.remove(0);
        System.out.println(jtLinkedList04);
        jtLinkedList04.remove(3);
        System.out.println(jtLinkedList04);
        jtLinkedList04.add(0, false);
        System.out.println(jtLinkedList04);
        jtLinkedList04.add(0,false);
        System.out.println(jtLinkedList04);
        jtLinkedList04.add(4,4);
        System.out.println(jtLinkedList04);
        jtLinkedList04.add(5,5);
        System.out.println(jtLinkedList04);
    }
}
增加小的封装增加泛型
public class JtLinkedList05 <E>{
    private Node first;
    private Node last;
    private int size;

    public void add(int index, E element) {
        checkRange(index);
        Node temp = getNode(index);
        Node newNode = new Node(element);
        Node up = temp.previous;
        if (temp != null) {
            if (0 < index && index < size - 1) {
                up.next = newNode;
                newNode.previous = up;
                newNode.next = temp;
                temp.previous = newNode;
            }
            if (index == 0) {
                first = newNode;
                newNode.previous = null;
                newNode.next = temp;
                temp.previous = newNode;
            }
            if (index == size - 1) {
                last = newNode;
                newNode.previous = temp.next;
                newNode.next = null;
                temp.next = newNode;
            }
            size++;
        }
    }

    public void remove(int index) {
        checkRange(index);
        Node temp = getNode(index);
        if (temp != null) {
            Node up = temp.previous;
            Node down = temp.next;
            if (up != null) {
                up.next = down;
            }
            if (down != null) {
                down.previous = up;
            }
            //被删除的元素是第一个
            if (index == 0) {
                first = down;
            }
            //被删除的元素是最后一个
            if (index == size - 1) {
                last = up;
            }
            size--;
        }
    }

    public E get(int index) {
        checkRange(index);
        Node temp = getNode(index);
        return temp != null ? (E) temp.element : null;
    }

    private void checkRange(int index) {
        if (index < 0 || index > size - 1) {
            throw new RuntimeException("索引数字不合法" + index);
        }
    }

    private Node getNode(int index) {
        checkRange(index);
        Node temp = null;
        if (index <= (size >> 1)) { //size>>1相当于除以2
            temp = first;
            for (int i = 0; i < index; i++) {
                temp = temp.next;
            }
        } else {
            temp = last;
            for (int i = size - 1; i > index; i--) {
                temp = temp.previous;
            }
        }
        return temp;
    }

    //[]
    //["a","b","c"]
    public void add(E element) {
        Node node = new Node(element);
        if (first == null) {
//            node.previous =null;
//            node.next = null;
            first = node;
            last = node;
        } else {
            node.previous = last;
            node.next = null;
            last.next = node;
            last = node;
        }
        size++;
    }

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder("[");
        Node temp = first;
        while (temp != null) {
            stringBuilder.append(temp.element + ",");
            temp = temp.next;
        }
        stringBuilder.setCharAt(stringBuilder.length() - 1, ']');
        return stringBuilder.toString();
    }

    public static void main(String[] args) {
        JtLinkedList05<String> jtLinkedList05 = new JtLinkedList05<>();
        jtLinkedList05.add("a");
        jtLinkedList05.add("b");
        jtLinkedList05.add("c");
        jtLinkedList05.add("d");
        jtLinkedList05.add("e");
        jtLinkedList05.add("f");
        System.out.println(jtLinkedList05);
        jtLinkedList05.remove(3);
        System.out.println(jtLinkedList05);
        System.out.println(jtLinkedList05.get(1));
        jtLinkedList05.remove(0);
        System.out.println(jtLinkedList05);
        jtLinkedList05.remove(3);
        System.out.println(jtLinkedList05);
        jtLinkedList05.add(0, "false");
        System.out.println(jtLinkedList05);
        jtLinkedList05.add(0, "true");
        System.out.println(jtLinkedList05);
        jtLinkedList05.add(4, "4");
        System.out.println(jtLinkedList05);
        jtLinkedList05.add(5, "5");
        System.out.println(jtLinkedList05);
        System.out.println(jtLinkedList05.get(1));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值