首页 > 解决方案 > 双向链表方法的问题

问题描述

我一直在尝试创建(我一直在学习)一个基于练习的双向链表,其中该列表将与货车一起训练。练习要求创建一个具有“货车名称”、“下一辆货车”和“上一辆货车”属性的“货车”类,以及具有添加货车、打印货车和锯开顺序的方法的另一个类“火车”火车的机车。我的问题是练习如何要求创建添加货车的方法,以及交换机车顺序的方法。添加货车的方法有一个参数,其数据类型为“货车”类,我真的没有创建这个方法。我将在下面的代码中向您展示我已经完成的工作。有人可以帮我吗?我还没有理解如何使用参数“

除此之外,该练习要求创建两列火车(然后是两个列表),并更改两列火车的两个机车。我想知道这是否真的可以用两个双向链表来交换它们之间的两个元素,或者它是否可以简单地交换两个双向链表的顺序,而不必更改它们之间的元素?因为我已经对其进行了足够多的搜索,并且没有发现任何可以在两个双向链表之间交换元素的信息。尽管如此,我在创建交换火车机车的方法时遇到了一些问题,因为该方法具有数据类型“wagon”,但它具有参数“wagon 名称”(字符串)和方法名称是“get wagon and remove”,所以我不知道这个练习真正想要什么。

我知道问题很长,但是对于这样一个复杂的例子(对我来说),我不能简洁。

public class Vagao {
  String nomeDoVagao;
  Wagon vagaoAnterior;
  Wagon vagaoPosterior;

public Vagao (String nomeDoVagao){
  this.nomeDoVagao = nomeDoVagao;
  vagaoAnterior = null;
  vagaoPosterior = null;
 }
}

public class Trem {
  Vagao head, tail = null;

//I do not know to proceed here
public void adicionarVagao (Vagao vagaoCriar){
  Vagao novo_Vagao = new Vagao (vagaoCriar.nomeDoVagão);

  if (head == null){
    head = tail = novo_Vagao;
    head.vagaoAnterior = null;
    tail.vagaoPosterior = null;
} else {
    tail.vagaoPosterior = novo_Vagao;
    novo_Vagao.vagaoAnterior = tail;
    tail = novo_Vagao;
    tail.vagaoPosterior = null;
  }
 }

//This is the other method, that I have not understood well, so I have not 
even begun it

public Vagao pegarVagaoRemover (String nomeDoVagao){...}
}

这就是我尝试创建“火车”并在控制台中打印它的方式,但它没有奏效:

public class Main {

public static void main(String[] args) {
  Trem trem = new Trem();

  trem.adicionarVagao("qualquer");

  trem.printTrem();
 }
}

标签: javadoubly-linked-list

解决方案


head并且tail它们本身并不是独立的货车。

所以一般不应该改变头部或尾部的字段。

最后添加:

novo_Vagao.vagaoAnterior = null;
novo_Vagao.vagaoPosterior = null;
if (head == null){
    head = tail = novo_Vagao;
} else {
    novo_Vagao.vagaoAnterior = tail;
    tail.vagaoPosterior = novo_Vago;
    tail = novo_Vagao;
}

删除将去:

if (vagao.vagaoPosterio == null) {
    tail = vagao.vagaoAnterior;
} else {
    vagao.vagaoPosterio.vagaoAnterio = vagao.vagaoAnterior;
}
...

所以:要更改哪些引用字段。


推荐阅读