手机
当前位置:查字典教程网 >编程开发 >Java >Java实现双向链表(两个版本)
Java实现双向链表(两个版本)
摘要:临近春节,项目都结束了,都等着回家过年了。下面是小编给大家研究数据结构的相关知识,链表算是经常用到的一种数据结构了,现将自己的实现展示如下,...

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

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

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实现啥夫曼编码

java 实现文件复制和格式更改的实例

Java排序实现的心得分享

java多线程和并发包入门示例

java中servlet实现登录验证的方法

java实现单链表中是否有环的方法详解

Java通过接口实现匿名类的实例代码

java hashtable实现代码

Java反射机制的实现详解

Java字符编码解码的实现详解

精品推荐
分类导航