7L-双线链表实现 (2)

查找 Object 所在位置 indexOf ,若找不到返回 -1

@Override public int indexOf(Object o) { int index = 0; if (Objects.isNull(o)) { for (Node<E> x = first; x != null; x = x.next) { if (x.item == null) { return index; } index++; } } else { for (Node<E> x = first; x != null; x = x.next) { if (x.item.equals(o)) { return index; } index++; } } return -1; }

判断 链表中是否存在 指定对象 contains ,其实还是利用 上面的 indexOf 方法,当返回值 不等于 -1 则说明包含该对象。

@Override public boolean contains(Object o) { return indexOf(o) != -1; } 节点删除

有两种删除情况:

根据下标删除指定位置的节点。

删除指定数据的节点。

删除指定位置节点

首先判断该 index 是否合法存在。

查找要删除的节点位置,重新设置被删除节点关联的指针指向。

node() 方法已经在前面的查找中封装好这里可以直接调用,我们再实现 unlink 方法,该方法还会用于删除指定对象,所以这抽出来实现复用。也是最核心最不好理解的方法,我们多思考画图理解下。

@Override public E remove(int index) { checkElementIndex(index); return unlink(node(index)); } public final void checkElementIndex(int index) { if (!isElementIndex(index)) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); } /** * Tells if the argument is the index of an existing element. */ private boolean isElementIndex(int index) { return index >= 0 && index < size(); } /** * Unlinks non-null node x. */ private E unlink(Node<E> x) { // assert x != null; final E element = x.item; final Node<E> next = x.next; final Node<E> prev = x.prev; // 若 只有一个节点,那么会执行 prev == null 和 next == null 分支代码 // 若 prev == null 则说明删除的是头结点,主要负责 x 节点跟前驱节点的引用处理 if (Objects.isNull(prev)) { first = next; } else { prev.next = next; x.prev = null; } // 若 next 为空,说明删除的是尾节点,主要负责 x 与 next 节点 引用的处理 if (Objects.isNull(next)) { last = prev; } else { next.prev = prev; x.next = null; } x.item = null; size--; return element; }

分别找出被删除节点 x 的前驱和后继节点,要考虑当前链表只有一个节点的情况,最后还要把被删除节点的 的 next 指针 ,item 设置 null,便于垃圾回收,防止内存泄漏。

删除指定数据

这里判断下数据是否是 null , 从头节点开始遍历链表,当找到索要删除的节点的时候低啊用前面封装好的 unlink 方法实现删除。

@Override public boolean remove(Object o) { if (Objects.isNull(o)) { for (Node<E> x = first; x != null; x = x.next) { if (x.item == null) { unlink(x); return true; } } } else { for (Node<E> x = first; x != null; x = x.next) { if (o.equals(x.item)) { unlink(x); return true; } } } return false; }

完整代码可以参考 GitHub:https://github.com/UniqueDong/algorithms.git

加群跟我们一起探讨,欢迎关注 MageByte,我第一时间解答。

推荐阅读

1.

2.

3.

4.

5.

6.

原创不易,觉得有用希望读者随手「在看」「收藏」「转发」三连。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxxfs.html