双链表结构

时间:2018-04-11 02:48:42

标签: java generics constructor linked-list doubly-linked-list

对于赋值,我必须为双链表编写构造函数。教授没有给我任何大的暗示,我正在努力满足他发布的指导方针。我应该以一种允许我创建一个包含三个节点的链表而不使用任何方法调用的方式编写构造函数。我只被允许使用“新”,变量声明和赋值语句。

链接列表应如下所示:

DLNode<Integer> list = new DLNode<Integer>(1, null, DLNode<Integer>(2, /* pointer to the first node */, DLNode<Integer>(3, /* pointer to the second node */, null)))

根据我到目前为止所知,我必须在一个大变量声明中创建所有三个DLNode。这段代码与他希望我的声明看起来类似,但它不适用于当前的构造函数。

public class DLNode<T> {
  private T element;
  private DLNode<T> next;
  private DLNode<T> previous;

  public DLNode(T element, DLNode<T> previous, DLNode<T> next) {
    /* You need to write the correct code here to create a correctly formed 
    double linked list */
    this.element = element;
    this.previous = previous;
    this.next = next;
  }

  public T getElement() {
    return element;
  }

  public DLNode<T> getNext() {
    return next;
  }

  public void setNext(DLNode<T> next) {
    this.next = next;
  }

  public DLNode<T> getPrevious() {
    return previous;
  }

  public void setPrevious(DLNode<T> previous) {
    this.previous = previous;
  }
}

以下是代码:

$('.removeImageInput').on('click', function(){
    var ID = $(this).attr('id');
    var a = $('#imageInputCurrent').val().split(',');
    if(a.indexOf(ID) != -1){
        a.splice(a.indexOf(ID), 1);
    }
    $('#imageInputCurrent').val(a.toString());
    $('.subImageListInput'+ID).hide();
});

我已经进行了明显的字段分配,但在那之后,他声称我仍然需要几行代码来完成这项工作。我们最近一直在学习链表,抽象数据类型,迭代器,for-each循环,类似接口和泛型,但我找不到我应该在笔记中做什么的提示。任何帮助都会非常感激。

仅供参考,我使用DrJava作为我的IDE,它有一个交互窗格,允许我测试代码片段而无需编写main方法并运行代码。我可以编译然后测试。

1 个答案:

答案 0 :(得分:0)

好吧,一旦朋友给我一个提示,我就知道该怎么做。我解决了一半的构造函数问题。问题是,由于这是一个双链表,仅仅让我创建的链表节点指向双链表中前面或后面的其他节点是不够的。我需要这样做,以便在创建一个新的双链表节点时,它不仅指向双链表中的其他节点,而且还改变了它指向的节点的指针。

基本上,如果我创建一个名为node1的新的双链表节点对象并让它指向另一个名为node2的双链表对象,我还必须更改node2的指针,使其指向node1。

这是最终的代码,以及我用来测试它的一些代码片段。

public class DLNode<T> {
  private T element;
  private DLNode<T> next;
  private DLNode<T> previous;

  public DLNode(T element, DLNode<T> previous, DLNode<T> next) {
     /* You need to write the correct code here to create a correctly formed 
     double linked list */
    this.element = element;
    if (next != null) {
      next.setPrevious(this);
      this.next = next;
    }
    if (previous != null) {
      previous.setNext(this);
      this.previous = previous;
    }
    if (previous == null) {
      this.previous = previous;
    }
    if (next == null) {
      this.next = next;
    }
  }

  public T getElement() {
    return element;
  }

  public DLNode<T> getNext() {
    return next;
  }

  public void setNext(DLNode<T> next) {
    this.next = next;
  }

  public DLNode<T> getPrevious() {
    return previous;
  }

  public void setPrevious(DLNode<T> previous) {
    this.previous = previous;
  }
}

/* Test Code
> DLNode<Integer> list = new DLNode<Integer>(1, null, null)
> DLNode<Integer> node2 = new DLNode<Integer>(2, list, null)
> DLNode<Integer> node3 = new DLNode<Integer>(3, node2, null)
> list.getElement()
1
> list.getNext().getElement()
2
> list.getNext().getNext().getElement()
3
> list.getPrevious()
null
> list.getNext().getPrevious().getElement()
1
> list.getNext().getNext().getPrevious().getElement()
2
*/

正如我之前所说,我没有问过这个问题,期望你们中的一个人能为我做功课。如果有人刚刚告诉我我需要让我的新节点指向的节点也指向后面就足够了。