我被要求将我的简单链接列表转换为双链表,如果有人可以给我一些指导。我很欣赏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;
}
}
答案 0 :(得分:1)
所以,似乎你想在另外两个节点的中间插入一个节点。
您需要做的是创建一个新节点,将指针precedent
和suivant
设置为上一个和下一个节点,并更新上一个和下一个节点的指针,类似于:
所以,如果你改变你的代码,那就是这样的:
// 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++;
}
}
您还必须将其他方法更改为始终将precedent
和suivant
指向上一个/下一个节点:
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()
函数中,您应该设置suivant
和precedent
变量。
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
变量的用途。
其他两种方法应该类似地工作