双链表构造函数
Double Linked List Constructor
对于一个赋值,我必须为双链表编写一个构造函数。教授没有给我任何大的提示,我正在努力满足他发布的指导方针。我应该以一种允许我在不使用任何方法调用的情况下创建具有三个节点的链表的方式编写构造函数。我只允许使用 "new"、变量声明和赋值语句。
链表应该是这样的:
+---+---+---+ +---+---+---+ +---+---+---+
list ---> | | | *-+---> | | | *-+---> | | | *-+--X
| | 1 | | | | 2 | | | | 3 | |
X--+-* | | | <---+-* | | | <---+-* | | |
+---+---+---+ +---+---+---+ +---+---+---+
根据我目前的了解,我必须在一个大变量声明中创建所有三个 DLNode。此代码片段与他希望我的声明看起来类似,但不适用于当前构造函数。
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)))
代码如下:
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;
}
}
我已经输入了明显的字段分配,但在那之后,他声称我仍然需要几行代码才能完成这项工作。我们最近一直在学习链表、抽象数据类型、迭代器、for-each 循环、可比接口和泛型,但我在笔记中找不到我应该做什么的提示。任何帮助将不胜感激。
仅供参考,我使用 DrJava 作为我的 IDE,它有一个交互面板,允许我测试代码片段,而无需编写 main 方法和 运行 代码。我可以编译然后测试。
好吧,在朋友的提示下,我想出了怎么做。我已经解决了一半的构造函数问题。问题是因为这是一个双链表,所以仅仅让我创建的链表节点指向双链表中它前面或后面的其他节点是不够的。我需要这样做,以便在创建新的双链表节点时,它不仅指向双链表中的其他节点,而且还更改它指向的节点的指针。
基本上,如果我创建一个名为 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
*/
正如我之前所说,我问这个问题并不是希望你们中的一个人能帮我做作业。如果有人刚刚告诉我我需要让我的新节点指向的节点也指向后方,那就足够了。
对于一个赋值,我必须为双链表编写一个构造函数。教授没有给我任何大的提示,我正在努力满足他发布的指导方针。我应该以一种允许我在不使用任何方法调用的情况下创建具有三个节点的链表的方式编写构造函数。我只允许使用 "new"、变量声明和赋值语句。
链表应该是这样的:
+---+---+---+ +---+---+---+ +---+---+---+
list ---> | | | *-+---> | | | *-+---> | | | *-+--X
| | 1 | | | | 2 | | | | 3 | |
X--+-* | | | <---+-* | | | <---+-* | | |
+---+---+---+ +---+---+---+ +---+---+---+
根据我目前的了解,我必须在一个大变量声明中创建所有三个 DLNode。此代码片段与他希望我的声明看起来类似,但不适用于当前构造函数。
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)))
代码如下:
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;
}
}
我已经输入了明显的字段分配,但在那之后,他声称我仍然需要几行代码才能完成这项工作。我们最近一直在学习链表、抽象数据类型、迭代器、for-each 循环、可比接口和泛型,但我在笔记中找不到我应该做什么的提示。任何帮助将不胜感激。
仅供参考,我使用 DrJava 作为我的 IDE,它有一个交互面板,允许我测试代码片段,而无需编写 main 方法和 运行 代码。我可以编译然后测试。
好吧,在朋友的提示下,我想出了怎么做。我已经解决了一半的构造函数问题。问题是因为这是一个双链表,所以仅仅让我创建的链表节点指向双链表中它前面或后面的其他节点是不够的。我需要这样做,以便在创建新的双链表节点时,它不仅指向双链表中的其他节点,而且还更改它指向的节点的指针。
基本上,如果我创建一个名为 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
*/
正如我之前所说,我问这个问题并不是希望你们中的一个人能帮我做作业。如果有人刚刚告诉我我需要让我的新节点指向的节点也指向后方,那就足够了。