链表之设计链表

题目

题意:

在链表类中实现这些功能:

  • get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。

  • addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。

  • addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。

  • addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。

  • deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。

解决

在这里插入图片描述

static class MyLinkedList<T>{

        private Node<T> headNode;
        private Node<T> tailNode;

        public MyLinkedList() {
        }

        // 返回某个index对应的节点值
        public T get(Integer index){

            Integer replace = 0;
            Integer targetReplace = index+1;
            Node result = null;

            if(targetReplace > size() || targetReplace< 0){
                return null;
            }else {
                Node currentNode =  headNode;
                while (currentNode != null){
                    replace++;
                    // 位置相同则返回
                    if(replace.equals(targetReplace)){
                        result = currentNode;
                        break;
                    }else {
                        // 当前节点往后移动
                        currentNode = currentNode.getNext();
                    }
                }
                return (T)result.getValue();
            }

        }

        // 插入在头部
        public void addAtHead(T val){
            Node<T> newNode = new Node<>();
            newNode.setValue(val);

            // 非正常情况
            if(tailNode == null && headNode == null){
                headNode = newNode;
                tailNode = newNode;
            }else{
                // 正常情况
                newNode.setNext(headNode);
                headNode = newNode;
            }
        }

        // 插入在尾部
        public void addAtTail(T val){
            Node<T> newNode = new Node<>();
            newNode.setValue(val);

            if(tailNode == null){
                tailNode = newNode;
                headNode = newNode;
            }

            tailNode.setNext(newNode);
            tailNode = newNode;
        }


        // 在指定index位置插入
        public void addAtIndex(Integer index,T val){

            if(index+1 > size()){
                return;
            }

            if(index+1 <= 0){
                addAtHead(val);
            }else if(index == size()){
                addAtTail(val);
            }else {
                // 正常index位置插入
                Node<T> newNode = new Node<>();
                newNode.setValue(val);

                // 建立虚拟节点,指定当前位置的前一个节点
                Node<T> virtualNode = new Node<>();
                virtualNode.setValue(null);
                virtualNode.setNext(headNode);

                Integer replace = 0;
                Integer targetReplace = index+1;
                Node currentNode =  headNode;
                while (currentNode != null){
                    replace++;
                    // 位置相同则插入
                    if(replace.equals(targetReplace)){
                        virtualNode.setNext(newNode);
                        newNode.setNext(currentNode);
                        break;
                    }else {
                        // 虚拟节点和当前节点往后移动
                        virtualNode = currentNode;
                        currentNode = currentNode.getNext();
                    }
                }


            }
        }


        // 删除指定index位置的Node
        public void deleteAtIndex(Integer index){

            Integer targetReplace = index+1;
            if(targetReplace > size() || targetReplace<= 0){
                return;
            }else{
                // 建立虚拟节点,指定当前位置的前一个节点
                Node<T> virtualNode = new Node<>();
                virtualNode.setValue(null);
                virtualNode.setNext(headNode);

                Integer replace = 0;
                Node currentNode =  headNode;
                while (currentNode != null){
                    replace++;
                    // 位置相同则删除
                    if(replace.equals(targetReplace)){
                        virtualNode.setNext(currentNode.getNext());
                        break;
                    }else {
                        // 虚拟节点和当前节点往后移动
                        virtualNode = currentNode;
                        currentNode = currentNode.getNext();
                    }
                }
            }
        }


        // 列出所有节点
        public ArrayList list(){
            ArrayList<T> result = new ArrayList<>();

            if(headNode == null){
                return result;
            }

            Node<T> currentNode;
            currentNode = headNode;
            while (currentNode != null){
                result.add(currentNode.getValue());
                currentNode = currentNode.getNext();
            }
            return result;
        }


        // 列出所有节点
        public ArrayList list(Node<T> headNode){
            Node<T> currentNode;
            ArrayList<T> result = new ArrayList<>();

            if(headNode == null){
                return result;
            }
            currentNode = headNode;
            while (currentNode != null){
                result.add(currentNode.getValue());
                currentNode = currentNode.getNext();
            }
            return result;
        }

        // 链表长度
        public Integer size(){
            return list().size();
        }


        // 返回头节点
        public Node<T> getHeadNode(){
            return headNode;
        }

    }
class Node<T>{
    private T value;
    private Node<T> next;


    public Node(T value, Node<T> next) {
        this.value = value;
        this.next = next;
    }

    public Node() {
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }

    public Node<T> getNext() {
        return next;
    }

    public void setNext(Node<T> next) {
        this.next = next;
    }

    @Override
    public String toString() {
        return "Node{" +
                "value=" + value +
                ", next=" + next +
                '}';
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白鸽呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值