当我遇到这个疑问时,我正在研究这个实现双向链表的解决方案
public class Solution
{
public static Node constructDLL(int []arr) {
Node head = new Node(arr[0]);
Node ptr = head;
for(int i = 1; i<arr.length; i++) {
Node node = new Node(arr[i]);
ptr.next = node;
node.prev = ptr;
ptr = node;
}
return head;
}
}
为什么我不能在这个链表问题中直接使用head而不是像这样初始化并使用ptr?
public class Solution
{
public static Node constructDLL(int []arr) {
Node head = new Node(arr[0]);
for(int i = 1; i<arr.length; i++) {
Node node = new Node(arr[i]);
head.next = node;
node.prev = head;
head= node;
}
return head;
}
}
如果ptr引用head,为什么返回ptr返回一个值,而返回head则返回数组中的所有值?我是链表新手,这些事情让我非常困惑。
如果您在第一个解决方案中执行
return ptr
而不是 return head
,您实际上会执行与第二个解决方案相同的操作。当然,您在 return
语句中使用的变量名称并不重要;重要的是您返回的节点(引用)。
因此很明显,通过该修改,您将返回附加到列表中的 last 节点(请参阅循环的最后一次迭代)。该节点的
next
字段仍为 null
。调用者必须通过 prev
引用导航回到头部才能最终找到它。