LinkedList的自实现

/**
 * 节点信息:
 * 内部类
 */
static class Node{
    String val;
    Node pre;
    Node next;
    public Node(String val){
        this.val = val;
    }
}

/**
 * 头部指针
 */
public Node head;

/**
 * 尾部指针
 */
public Node tail;

//add
/**
 * 方法功能:
 *  从头部新增
 */
public void addFirst(String data){
    Node node = new Node(data);
    if (head == null){
        head = node;
        tail = node;
        return;
    }
    node.next = head;
    head.pre = node;
    head = node;

}

/**
 * 方法功能:
 *  从尾部新增
 */
public void addLast(String data){
    Node node = new Node(data);
    if (head == null){
        head = node;
        tail = node;
    }
}

/**
 * 方法功能:
 *  从任意下标位置插入数据,
 *  第一个数据节点下标为0
 *
 * @param index
 * @param data
 * @return
 */
public boolean addIndex(int index,String data){
    if (index<0 || index>size()){
        System.out.println("index下标位置不合法");
        return false;
    }
    if (index == 0){
        addFirst(data);
        return true;
    }else if (index == size()){
        addLast(data);
        return true;
    }
    Node oldNode= get(index);
    Node newNode = new Node(data);
    newNode.pre = oldNode.pre;
    oldNode.pre.next = newNode;
    newNode.next = oldNode;
    oldNode.pre = newNode;
    return true;
}

//get

/**
 * 方法功能:
 *  根据下标获取下标位置处的元素
 *
 * @param index
 * @return
 */
public Node get(int index){
    Node node = head;
    while (index != 0){
        node = node.next;
        index--;
    }
    return node;
}

//contains

/**
 * 方法功能:
 *  判断是否包含某个元素
 *
 * @param key
 * @return
 */
public boolean contains(String key){
    Node node = head;
    while (node != null){
        if ((key == null && node.val == null) || key.equals(node.val)){
            return true;
        }
        node = node.next;
    }
    return false;
}

//remove

/**
 * 方法功能:
 *  从左往右,移除链表中元素为key的元素第一次出现位置的节点
 *
 * @param key
 */
public void remove(String key){
    Node node = head;
    while (node != null){
        if ((key == null && node.val == null)||key.equals(node.val)){
            if (node == head){
                head = head.next;
                if (head != null){
                    head.pre = null;
                }else {
                    tail = null;
                }
            }else {
                node.pre.next = node.next;
                if (node.next != null){
                    node.next.pre = node.pre;
                }else {
                    tail = tail.pre;
                }
            }
            return;
        }
        node = node.next;
    }

}

/**
 * 方法功能:
 *  移除链表中元素为key的元素的节点
 *
 * @param data
 */
public void removeAllKey(String data){
    Node node = head;
    while (node != null){
        if ((data == null && node.val == null) || data.equals(node.val)){
            if (node == head){
                head = head.next;
                if (head != null){
                    head.pre = null;
                }else {
                    tail = null;
                }
            }else {
                node.pre.next = node.next;
                if (node.next != null){
                    node.next.pre = node.pre;
                }else {
                    tail = tail.pre;
                }
            }
        }
        node = node.next;
    }
}

//size

/**
 * 方法功能:
 *  获取链表节点长度
 *
 * @return
 */
public int size(){
    Node node = head;
    int count = 0;
    while (node != null){
        count++;
        node = node.next;
    }
    return count;
}

//clear

/**
 * 方法功能:
 *  清空链表数据
 */
public void clear(){
    Node node = head;
    while (node != null){
        Node temp = node.next;
        node.next = null;
        node.pre = null;
        node = temp;
    }
    head = null;
    tail = null;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值