美文网首页
手写双向链表

手写双向链表

作者: wintersweett | 来源:发表于2019-09-29 16:28 被阅读0次

package com.Simba.Utils;

/*
手写双向链表
*/
public class LinkedList<E> {
private static class Node<E> {
E item;//节点的数据域
Node<E> pre;
Node<E> next;
public Node(Node<E> pre,E item,Node<E>next){
this.pre=pre;
this.item=item;
this.next=next;
}

}
public LinkedList() {

}
Node<E> first;//头节点
Node<E>last;//尾节点
int size;
public void add(E e) {
    linkLast(e);
}
//添加数据在index位置
public void add(int index,E e) {
    if (index < 0 || index > size) {
        return ;
    }
    if (index == size) {//如果添加的位置是尾部
        linkLast(e);
    } else {
        Node<E>target=node(index);
        Node<E>pre=target.pre;
        Node<E>newNode=new Node<>(pre,e,target);

        if (pre == null) {
            first=newNode;
        } else {

            pre.next=newNode;
            target.pre=newNode;
        }
        size++;
    }
}
//删除元素
public void remove(int index) {
    Node<E>target=node(index);
    unLinkNode(target);
}

private void unLinkNode(Node<E> target) {
    Node<E> pre=target.pre;
    Node<E>next=target.next;
    if (pre == null) {
        first=target.next;
    } else {
        pre.next=target.next;
    }
    if (next == null) {
        last = target.pre;

    } else {
        next.pre=target.pre;
    }
    size--;
}

//直接在尾部添加的情况
private void linkLast(E e) {
    Node<E> newNode=new Node<>(last,e,null);
    Node<E> l=last;//l作为临时变量保存的中间值
    last=newNode;//新节点变为last
    if (l == null) {
        first=newNode;
    } else {

        l.next=newNode;//以前last的next指向新节点
    }
    size++;
}
//中间插入情况下,需要先搜索定位到,才能插入
//查找位置
public E get(int index) {
    if (index <0||index>size) {
        return null;
    }
    return node(index).item;//返回那个节点的数据域

}

//获取index位置上的节点
private Node<E> node(int index) {
if (index < (size>>1)) {

        Node<E> node = first;
        for (int i = 0; i < index; i++) {
            node = node.next;
        }
        return node;
    } else {
        Node<E> node=last;
        for (int i=size-1;i>index;i--) {
            node=node.pre;
        }

        return node;
    }


}

}

相关文章

  • 手写双向链表

    双向链表是指每个节点都包含两个指针分别指向其前驱和后继的链表,双向链表在遍历时更灵活,可以向前或向后遍历,在查找元...

  • 手写双向链表

    package com.Simba.Utils; /*手写双向链表*/public class LinkedLis...

  • 手写双向链表

    双向链表,又称为双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表...

  • 7.双向链表正确实现方式

    链表是基本的数据结构,尤其双向链表在应用中最为常见,LinkedList 就实现了双向链表。今天我们一起手写一个双...

  • 双向链表&双向循环链表

    链表分为:单链表、单向循环链表、双向链表、双向循环链表本节主要说明:双向链表、双向循环链表 定义结点 一、双向链表...

  • 手写LinkedList(双向链表)

    系统jdk里的LinkedList是由一个个节点连接起来的,节点就相当于一个对象,里面有数据域和指针域,数据域是存...

  • 线性表-双向链表与双向循环链表

    双向链表 双向链表示意图如下: 数据结构定义 创建双向链表 双向链表插入元素 双向链表删除元素 双向链表打印元素 ...

  • day03-双向链表

    双向链表: 单向链表只能单向查找,双向链表可以双向查找。 啥是双向链表? 双向链表可以双向查数据,所以就不存在单向...

  • 线性表--链式存储结构--双向链表

    双向链表 一、双向链表结构 双向链表结点结构 既然单链表可以有循环链表,那么双向链表当然也可以有。 由于这是双向链...

  • 双向链表和双向循环链表

    双向链表 线性表-双向链表的结点结构: 带头结点的双向链表: 1.双向链表初始化 2.遍历双向链表 2.双向链表插...

网友评论

      本文标题:手写双向链表

      本文链接:https://www.haomeiwen.com/subject/qjavuctx.html