我有一个链表类和一个节点类,我想写一个构造函数,用大小为'n'的相同节点填充链表。然而,我似乎无法正确地表述这个逻辑。我现在的位置:
我有字段"head"来表示链接列表的头。
"node"类有一个字段来表示下一个值(考虑:node.next(。
public LinkedList(int size, Object value)
{
int index = 0;
head = value; //setting first node to value
Object workingReference = head; //creating a working reference to iterate through the list
for(index = 0; index < size - 1; index++)
{
workingReference.next = value; //setting the next node to the given value
workingReference = workingReference.next; //setting the "index" to the next "index"
}
}
问题是,当循环遇到约束时,从来没有"null"值,因此下一个节点总是给定的"值",使列表"无限"。我曾经尝试过将value.next设置为null,但出于某种原因,这将head.next设置成了null。我觉得解决方案就在我面前,但我没有以正确的方式思考。谢谢你抽出时间。
首先,将value
和workingReference
的类型更改为Node
而不是Object
,以帮助每个人理解。
您的主要问题是在分配value
时没有复制它。您可能想要的是value
变量的值,这就是为什么在这里将其称为Node
而不是Object
非常有用。
public LinkedList(int size, Node value)
{
int index = 0;
head = value;
Node workingReference = head;
for(index = 0; index < size - 1; index++)
{
// Here, workingReference, head and value are all the same thing
// So when you set workingReference.next = value,
// You've created a loop (value.next points to value)
workingReference.next = value;
workingReference = workingReference.next;
}
}
您要做的是每次使用value
节点的内容创建一个新节点。让我们将value
重命名为initialNode
,以更清楚地了解修复的工作原理:
public LinkedList(int size, Node initialNode)
{
int index = 0;
head = initialNode;
Node workingReference = head;
for(index = 0; index < size - 1; index++)
{
Node newNode = new Node(initialNode.value);
workingReference.next = newNode;
workingReference = workingReference.next;
}
}
现在,每个节点都是新的,而不是创建了一个循环。head
指向initialNode
,并且其next
(以及用于size
迭代的所有next
s(都指向该initialNode
的value
字段。
如果您希望Object值是传递给方法的东西,请这样做:
public LinkedList(int size, Object initialValue)
{
int index = 0;
head = new Node(initialValue);
Node workingReference = head;
for(index = 0; index < size - 1; index++)
{
Node newNode = new Node(initialValue);
workingReference.next = newNode;
workingReference = workingReference.next;
}
}