java双链表,简单链表转换为双链表

时间:2014-03-08 01:43:56

标签: java

我被要求将我的简单链接列表转换为双链表,如果有人可以给我一些指导。我很欣赏thx ..当我插入带有insertedapres(元素)的元素时,我应该把新节点放在temp节点中吗?

public class dlink {

private static class node{

 private Object element;
 private node next;
 private node prev;

 public node(Object element){
         this.element = element;
         next = null;
         prev= null;
     }
 }

2 个答案:

答案 0 :(得分:1)

所以,似乎你想在另外两个节点的中间插入一个节点。

您需要做的是创建一个新节点,将指针precedentsuivant设置为上一个和下一个节点,并更新上一个和下一个节点的指针,类似于:

Double Linked List Node Insertion

所以,如果你改变你的代码,那就是这样的:

// Insert a new node after position
public void insererApres(Object element){
    if(debut == null)
        insererDebut(element);
    else if (position == fin)
        insererFin(element);
    else {
        // First, create the new node
        Noeud nouveau = new Noeud(element);

        // Set the pointers
        nouveau.suivant = position.suivant;
        nouveau.precedent = position;

        // Update the previous node pointer
        nouveau.precedent.suivant = nouveau;

        // Update the next node pointer
        nouveau.suivant.precedent = nouveau;

        position = position.suivant;

        nbElement++;            
    }
}

您还必须将其他方法更改为始终将precedentsuivant指向上一个/下一个节点:

public void insererDebut(Object element){
    Noeud noeud = new Noeud(element);

    noeud.suivant = debut;

    if (noeud.suivant!=null)
        noeud.suivant.precedent = noeud;

    debut = noeud;

    if (nbElement == 0)
        fin = debut;

    position = debut;

    nbElement++;
}

public void insererFin(Object element){
    if(debut == null)
        insererDebut(element);
    else{   
        fin.suivant = new Noeud(element);

        fin.suivant.precedent = fin;

        fin = fin.suivant;

        position = fin;

        nbElement++;
    }               
}

答案 1 :(得分:0)

不仅仅是insertionapres()方法,而且在所有方法中都需要临时值。例如,在insererDebut()函数中,您应该设置suivantprecedent变量。

public void insererDebut(Object element){

     Noeud n = new Noeud(element);

     nbElement++;
     if (nbElement == 0){
         debut = n
         fin = debut;
     }else{
         debut.precedent = n;
         n.suivant = debut;
         debut = n;
     }
 }

我不确定您的position变量的用途。

其他两种方法应该类似地工作