Java实现双向链表(两个版本)_Java教程-查字典教程网
Java实现双向链表(两个版本)
Java实现双向链表(两个版本)
发布时间:2016-12-28 来源:查字典编辑
摘要:临近春节,项目都结束了,都等着回家过年了。下面是小编给大家研究数据结构的相关知识,链表算是经常用到的一种数据结构了,现将自己的实现展示如下,...

临近春节,项目都结束了,都等着回家过年了。下面是小编给大家研究数据结构的相关知识,链表算是经常用到的一种数据结构了,现将自己的实现展示如下,欢迎大神赐教。

第一个版本,没有最后一个节点,每次从根节点开始遍历

public class LinkedList<E> { private Node head; public LinkedList() { } public E getFirst(){ if(head==null){ return null; } return head.value; } public LinkedList<E> addFirst(E e){ head.pre=new Node(e, null, head); head=head.pre; return this; } public LinkedList<E> addNode(E e){ Node lst=head; if(lst==null){ this.head=new Node(e, null, null); return this; }else{ while(true){ if(lst.next==null){ break; }else{ lst=lst.next; } } lst.next=new Node(e, lst, null); return this; } } public LinkedList<E> remove(E e){ Node lst=head; if(lst==null){ throw new NullPointerException("the LinkedList is empty."); }else{ while(true){ if(e.equals(lst.value)){ //移除这个元素 if(lst.pre!=null){ lst.pre.next=lst.next; } if(lst.next!=null){ lst.next.pre=lst.pre; } lst=null; break; } lst=lst.next; } return this; } } @Override public String toString() { StringBuffer buff=new StringBuffer("["); Node lst=this.head; while(lst!=null){ buff.append(lst.value+","); lst=lst.next; } return buff.substring(0, buff.length()-1)+"]"; } /**节点信息*/ private class Node{ public Node pre; public E value; public Node next; public Node(E value,Node pre,Node next) { this.value=value; this.pre=pre; this.next=next; } } }

第二个版本,有了最后一个节点

public class LinkedList<E> { private Node head; private Node last; public LinkedList() { } public E getFirst(){ if(head==null){ return null; } return head.value; } public E getLast(){ if(last==null){ return null; } return last.value; } public LinkedList<E> addFirst(E e){ head.pre=new Node(e, null, head); head=head.pre; return this; } public LinkedList<E> addNode(E e){ Node lst=last; if(lst==null){//如果最后一个节点是空的则这个链表就是空的 this.last=new Node(e, null, null); this.head=this.last; return this; }else{ while(true){ if(lst.next==null){// break; }else{ lst=lst.next; } } lst.next=new Node(e, lst, null); last=lst.next; return this; } } public LinkedList<E> remove(E e){ Node lst=head; if(lst==null){ throw new NullPointerException("the LinkedList is empty."); }else{ while(true){ if(e.equals(lst.value)){ //移除这个元素 if(lst.pre!=null){ lst.pre.next=lst.next; } if(lst.next!=null){ lst.next.pre=lst.pre; } lst=null; break; } lst=lst.next; } return this; } } @Override public String toString() { StringBuffer buff=new StringBuffer("["); Node lst=this.head; while(lst!=null){ buff.append(lst.value+","); lst=lst.next; } return buff.substring(0, buff.length()-1)+"]"; } /**节点信息*/ private class Node{ public Node pre; public E value; public Node next; public Node(E value,Node pre,Node next) { this.value=value; this.pre=pre; this.next=next; } } }

注:以上两个版本都没有考虑在多线程下使用的情况。

以上所述是小编给大家介绍的Java实现双向链表(两个版本)的相关知识,希望对大家有所帮助。

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新Java学习
    热门Java学习
    编程开发子分类