Java自己实现双向链表LinkList
/** * <p> * Node 双向链表实体类 * <p> * * @author <a href="mailto:yangkj@corp.21cn.com">yangkj</a> * @version * @since 2016年8月15日 */ public class Node { // 双向链表-前一节点 Node previous; // 双向链表-当前节点对象 Object obj; // 双向链表-后一节点 Node next; public Node() { super(); } public Node(Node previous, Object obj, Node next) { super(); this.previous = previous; this.obj = obj; this.next = next; } public Node getPrevious() { return previous; } public void setPrevious(Node previous) { this.previous = previous; } public Object getObj() { return obj; } public void setObj(Object obj) { this.obj = obj; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } }
/** * * <p> * MyLinkList 双向列表 * <p> * * @author <a href="mailto:yangkj@corp.21cn.com">yangkj</a> * @version * @since 2016年8月15日 */ public class MyLinkList { /** * 首节点 */ private Node firstNode; /** * 尾节点 */ private Node lastNode; /** * 节点个数 */ private int size; public MyLinkList() { super(); } /** * 添加节点 * * @param obj */ public void add(Object obj) { if (firstNode == null) { // 如果链表为空,则设置当前对象为首节点,同时也是尾节点;且该节点的前一节点和后一节点都为null Node node = new Node(null, obj, null); firstNode = node; lastNode = node; } else { // 直接在lastNode后面添加新的节点 Node node = new Node(lastNode, obj, null); // 旧的尾节点的下一个节点指向新加节点 lastNode.setNext(node); // 链表的尾节点设成新加节点 lastNode = node; } size++; } /** * 指定索引位置上插入节点 * * @param index * @param obj */ public void add(int index, Object obj) { Node temp = node(index); if (temp != null) { Node up = temp.previous; Node newNode = new Node(up, obj, temp); up.setNext(newNode); temp.setPrevious(newNode); size++; } } /** * 获取指定节点对象 * * @param index * @return */ public Object get(int index) { Node temp = node(index); if (temp != null) { return temp.obj; } else { return null; } } /** * 越界检测 * * @param index */ private void rangCheck(int index) { if (index < 0 || index > size) { throw new ArrayIndexOutOfBoundsException(index); } } /** * 移除指定索引 的节点 * * @param index */ public void remove(int index) { // 越界检测 Node temp = node(index); if (temp != null) { Node up = temp.previous; Node down = temp.next; up.next = down; up.previous = up; temp = null; size--; } } /** * 获取指定索引下的节点 * * @param index * @return */ private Node node(int index) { rangCheck(index); Node temp = null; if (firstNode != null) { temp = firstNode; for (int i = 0; i < index; i++) { temp = temp.next; } } return temp; } /** * 设置指定索引的值 * @param index * @param obj */ public void set(int index,Object obj){ rangCheck(index); Node temp = node(index); if(temp!=null){ temp.setObj(obj); } } /** * 获得链表长度 * * @return */ public int size() { return size; } public static void main(String[] args) { MyLinkList linkList = new MyLinkList(); linkList.add("aaa"); linkList.add("bbb"); linkList.add("ccc"); System.out.println(linkList.get(1)); linkList.set(1, "fff"); System.out.println(linkList.get(1)); } }