我对Java有点陌生,目前有一件事在引用方面有点困扰我。
我有一个返回void
的方法。我将链表传递给此方法。还有另一个称为 noDuplicateLL
的链表变量引用同一个链表。 noDuplicateLL
跳过链表中的节点。
法典:
public static void removeDuplicate(LinkedListNode a) {
LinkedListNode noDuplicateLL = null;
if (a == null) {
//return null;
} else {
HashMap<Integer, Boolean> duplicateCheck = new HashMap<Integer, Boolean>();
while (a != null) {
// check in hashtable O(1)
if (duplicateCheck.containsKey(a.data)) {
noDuplicateLL.next = a.next;
} else {
noDuplicateLL = a;
duplicateCheck.put(a.data, true);
}
// update
a = a.next;
}
}
}
LinkedListNode a
遍历整个列表。 一旦a
到达null
,LinkedListNode noDuplicateLL
就会停止移动。因此,一旦完成此方法,两个指针都将指向列表中的其他位置,而不是前面。
下面的方法从头到尾打印在列表中。
public static void printLinkedList(LinkedListNode head) {
while (head != null) {
System.out.println(head.data);
head = head.next;
}
}
我的主要:
LinkedListNode LL = LinkedList.randomLinkedList(nodeVal);
removeDuplicate(LL);
printLinkedList(LL);
当 LL 作为 a
传递到方法中时,为什么输出仍然从链表的开头到结尾打印?是因为a
只是指向链表中的节点,而LL
保持对链表前面的引用吗?
LL --> some head node
// invoke method
// LL's value bound to parameter a
a --> some head node
// method executes
a --> head's next
a --> that next's next
...
a --> null
// method exits
LL
仍指向原始头节点。
是因为 a 只是指向链表中的节点,而 LL 维护对链表前面的引用?
是的。请尽快阅读此内容。