package com.test.tmp; public interface IList<E> { boolean add(E e); int getSize(); E get(int index); E getFirst(); E getLast(); boolean remove(int index); boolean remove(E e); boolean contains(E e); void reverse(); }
实现类
package com.test.tmp; import java.util.function.Consumer; /** * 双向链表,非线程安全 * @author yq * * @param <E> */ public class LinkedList<E> implements IList<E>{ /** * 链表第一个元素 */ private Node first; /** * 最后一个元素 */ private Node last; /** * 元素个数 */ private int size; /** * 双向链表节点结构体,用于构造节点元素 */ private class Node { //节点元素值 E item; //节点的前置节点 Node pre; //节点的后直节点 Node next; /** * 节点构造函数,用于构造节点 */ public Node(Node pre, E item, Node next) { this.pre = pre; this.item = item; this.next = next; } } /** * */ @Override public boolean add(E e) { final Node copyLast = last; //加的元素总是在最后,最后的next总是为null final Node newNode = new Node(copyLast, e, null); //新添加的元素肯定为最后一个元素 last = newNode; /* * 如果最后一个元素为null,说明链表为空,添加第一个元素. */ if(copyLast == null) { first = newNode; } else { copyLast.next = newNode; } //添加一个元素,链表长度加1 size++; return true; } @Override public int getSize() { return size; } @Override public E get(int index) { final Node indexNode = indexOf(index); return indexNode.item; } @Override public E getFirst() { return first.item; } @Override public E getLast() { return last.item; } /** * 根据数组元素下标索引返回对应的元素值 * @param index 索引号,最小为0,最大为size-1 */ @Override public boolean remove(int index) { if(index < 0) { throw new IllegalArgumentException(); } if(index == 0) { first = first.next; first.pre = null; size--; return true; } if(index == size -1) { last = last.pre; last.next = null; size--; return true; } final Node indexNode = indexOf(index); final Node indexPre = indexNode.pre; final Node indexNext = indexNode.next; indexPre.next = indexNext; indexNext.pre = indexPre; size--; return true; } private Node indexOf(int index) { Node next = first; for(int i = 0 ; i < index; i++) { next = next.next; } return next; } @Override public boolean remove(E e) { if(first == null || last == null) { return false; } final Node find = find(e); if(find == null) { return false; } Node findPre = find.pre; Node findNext = find.next; if(findNext != null) { findPre.next = findNext; findNext.pre = findPre; } else { last = findPre; last.next = null; } size--; return true; } private Node find(E e) { Node findNode = null; Node next = first; for(int i = 0 ; i < size ; i++) { if(next == null) { return next; } if(next.item != null && next.item.equals(e)) { findNode = next; break; } else if(next.item == null && e == null){ findNode = next; break; } next = next.next; } return findNode; } @Override public boolean contains(E e) { boolean founded = false; if(size < 1) { return false; } Node next = first; for(int i = 0 ; i < size; i++) { if(next == null) { return false; } if(next.item != null && next.item.equals(e)) { founded = true; break; } else if(next.item == null && e == null){ founded = true; break; } next = next.next; } return founded; } @Override public void reverse() { first = reverse(first); } /** * 递归反转链表 * @param first * @return */ private Node reverse(Node first) { if(first == null) { return null; } if(first.next == null) { return first; } Node second = first.next; Node rest = reverse(second); second.next = first; first.next = null; return rest; } class Iterator implements java.util.Iterator<E> { @Override public boolean hasNext() { return false; } @Override public E next() { return null; } @Override public void remove() { } @Override public void forEachRemaining(Consumer<? super E> action) { } } }
相关推荐
用双向链表实现电话簿管理。具有加入、删除、显示、修改和查询联系人电话号码的功能。
* 基于双向链表实现双端队列结构 */ package dsa; public class Deque_DLNode implements Deque { protected DLNode header;//指向头节点(哨兵) protected DLNode trailer;//指向尾节点(哨兵) protected ...
用单链表和双向链表实现的航空订票系统,欢迎各位下载。
采用双向链表实现的AOI,可支持大量实体的范围检测,实现了进入AOI和离开AOI采用不同的半径
双向链表实现,C语言双向链表,数据结构实现
数据结构大作业,c++用双向链表实现约瑟夫环,内含.h与.cpp
定义、实现并测试一个双向链表结点类DNode。 链表结点类中包含私有数据成员为两个整数x,y以及左结点指针left及右结点指针right。 包含的函数成员包括: (a)对结点的数据成员赋值setDNodeValues(int,int,DNode* ...
已知N个人(以编号1,2,3...n分别表示)围成一个圈。 从编号为K的人开始报数,数到M的那个人出列,他的下一个人又从1开始报数,依照此规律重复下去,直到圆圈中的人全部出列。 问题:请打印出这N个的...双向链表实现的
C++ 双向链表实现学生管理系统
排序插入,更具数据查找结点及修改结点数据等功能,链表根据姓名排序 根据姓名查找记录时支持通配符*和?,即*通配任意字符和字符串,?通配一个字符,字符不分大小。 将工资管理以文件的形式存在磁盘上,每次操作时...
双向链表实现多项式加法和乘法
建立双向链表实现对双向链表的插入删除操作1参考.pdf
通过双向链表实现按照ID序列插入,可以排序实现插入、删除、更新、修改;
C语言通讯录(双向链表实现)
相信大家都明白 LinkedList 是基于双向链表而实现的,本篇文章主要讲解一下双向链表的实现,并且我们参考 LinkedList 自己实现一个单链表尝试一下。 什么是链表? 简单的来讲一下什么是链表:首先链表是一种线性的...
使用双向链表实现快速排序,C语言,有详细注释
代码基于标准C++,可以用vscode,vs,qt等IDE打开。具备基本的双链表操作,如头插尾插,前驱遍历和后继遍历,求长度等等。
C++用双向链表实现的贪吃蛇。是DOS下开发的。没有使用system("cls") 所以不闪屏。。 初学者可以用这个训练数据结构中的双向链表使用,写有意义的小游戏。