Java实现双向链表(两个版本)

网友投稿 192 2023-07-22


Java实现双向链表(两个版本)

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

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

public class LinkedList {

private Node head;

public LinkedList() {

}

public E getFirst(){

if(head==null){

return null;

}

return head.value;

}

public LinkedList addFirst(E e){

head.pre=new Node(e, null, head);

head=head.pre;

return this;

}

public LinkedList 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 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.http://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 {

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 addFirst(E e){

head.pre=new Node(e, null, head);

head=head.pre;

return this;

}

public LinkedList 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 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实现双向链表(两个版本)的相关知识,希望对大家有所帮助。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:深入解析Java设计模式编程中观察者模式的运用
下一篇:java迭代子模式详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~