重写LinkedList的addAll方法
Rewriting LinkedList addAll method
在学校,我正在做一个重写 LinkedList 的项目。我的 class 是一个名为 StringLinkedList 的单向链表(目前只能容纳字符串)。我正在编写 addAll 方法,但我的代码有问题。它适用于列表的开头和结尾,但我不明白为什么它在插入列表中间时不起作用
这里是方法和相关方法
public boolean addAll( int index, StringLinkedList strLis ) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException();
}
if (strLis.size == 0) {
return false;
}
if (this.size() == 0) {
head = strLis.head;
}
else if (index == 0) {
strLis.nodeGet(size - 1).next = head;
head = strLis.head;
}
else if (index == size) {
nodeGet(size - 1).next = strLis.head;
}
else {
Node prev = nodeGet(index - 1);
Node succ = prev.next;
prev.next = strLis.head;
strLis.nodeGet(size - 1).next = succ;
}
size += strLis.size();
return true;
}
这是我的节点 class(嵌入在 StringLinkedList class)
class Node {
private Object data;
private Node next;
/**
* This builds a Node instance
* This instance of Node will initially contain
* the data passed via the parameter
* and have the pointer to the next node set to null
* @param data data that will be held in the node
*/
public Node(Object data) {
this(data, null);
}
/**
* This builds a Node instance
* This instance of Node will initially contain
* the data passed via the parameter
* and have the pointer to the next node set to the Node parameter
* @param data data to be held in node
* @param next reference to next node in list
*/
public Node(Object data, Node next) {
this.data = data;
this.next = next;
}
}
这是我的 nodeGet 方法
private Node nodeGet(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
Node temp = head;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
return temp;
}
此外,我知道我只是将引用复制到 .next 字段中,您通常不应该这样做。通常您会在将新节点添加到列表时实例化它。我的老师说这对于项目的功能来说不是必需的。
something is wrong with my code
考虑包括失败的测试用例和生成的错误消息,而不是上面的。
这一行有一个错误:
strLis.nodeGet(size - 1).next = succ;
size
保存源列表的大小而不是 strLis
的大小。将其替换为:
strLis.nodeGet(strLis.size() - 1).next = succ;
假设 StringLinkedList
有一个 size()
方法,如果不存在的话应该很容易添加。
而且至少应该能解决你的问题。同样,确保代码正常工作的唯一方法是尽可能多地投入边缘测试用例。
在学校,我正在做一个重写 LinkedList 的项目。我的 class 是一个名为 StringLinkedList 的单向链表(目前只能容纳字符串)。我正在编写 addAll 方法,但我的代码有问题。它适用于列表的开头和结尾,但我不明白为什么它在插入列表中间时不起作用
这里是方法和相关方法
public boolean addAll( int index, StringLinkedList strLis ) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException();
}
if (strLis.size == 0) {
return false;
}
if (this.size() == 0) {
head = strLis.head;
}
else if (index == 0) {
strLis.nodeGet(size - 1).next = head;
head = strLis.head;
}
else if (index == size) {
nodeGet(size - 1).next = strLis.head;
}
else {
Node prev = nodeGet(index - 1);
Node succ = prev.next;
prev.next = strLis.head;
strLis.nodeGet(size - 1).next = succ;
}
size += strLis.size();
return true;
}
这是我的节点 class(嵌入在 StringLinkedList class)
class Node {
private Object data;
private Node next;
/**
* This builds a Node instance
* This instance of Node will initially contain
* the data passed via the parameter
* and have the pointer to the next node set to null
* @param data data that will be held in the node
*/
public Node(Object data) {
this(data, null);
}
/**
* This builds a Node instance
* This instance of Node will initially contain
* the data passed via the parameter
* and have the pointer to the next node set to the Node parameter
* @param data data to be held in node
* @param next reference to next node in list
*/
public Node(Object data, Node next) {
this.data = data;
this.next = next;
}
}
这是我的 nodeGet 方法
private Node nodeGet(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
Node temp = head;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
return temp;
}
此外,我知道我只是将引用复制到 .next 字段中,您通常不应该这样做。通常您会在将新节点添加到列表时实例化它。我的老师说这对于项目的功能来说不是必需的。
something is wrong with my code
考虑包括失败的测试用例和生成的错误消息,而不是上面的。
这一行有一个错误:
strLis.nodeGet(size - 1).next = succ;
size
保存源列表的大小而不是 strLis
的大小。将其替换为:
strLis.nodeGet(strLis.size() - 1).next = succ;
假设 StringLinkedList
有一个 size()
方法,如果不存在的话应该很容易添加。
而且至少应该能解决你的问题。同样,确保代码正常工作的唯一方法是尽可能多地投入边缘测试用例。