我想知道这个函数在尝试从单向链表中删除节点时如何获取根节点。我理解整个删除部分。
class LinkedList {
LinkedListNode root;
// Remove the nodes which contain data equal to obj
void deleteNode(Object obj) {
// special case for root
if( root.data.equals(obj) ) {
root = root.next;
}
LinkedListNode current = root;
// iterate through list looking for obj
while( current.next != null ) {
// match found
if( current.next.data.equals(obj) ) {
// cut out the node
current.next = current.next.next;
}
current = current.next;
}
}
}
private class LinkedListNode {
Object data;
LinkedListNode next;
}
我不确定为什么仅仅通过创建一个LinkedListNode根,它指的是根节点。清晰易懂的帮助将不胜感激。
从理论上讲,我没有创建 LinkedListNode 根目录,我可以只向 delete 函数传递一个额外的参数,并根据其数据指定哪个是头部吗?
LinkedListNode deleteNode(LinkedListNode head, int d) {
LinkedListNode n = head;
if (n.data == d) {
return head.next; /* moved head */
}
while (n.next != null) {
if (n.next.data == d) {
n.next = n.next.next;
return head; /* head didn’t change */
}
n = n.next;
}
}
我不确定我是否理解这个问题...
LinkedListNode root
是类LinkedList
的私有成员,大概是在构造函数和/或AddNode
函数或其他函数的其他地方初始化的。初始化成员root
(并引用列表的根节点)后,允许像DeleteNode
这样的函数使用它,例如 if( root.data.equals(obj) ) { root = root.next; }
我希望这有所帮助...
它不是自动的。"root"是 LinkedList 类的类变量,也就是说,LinkedList 类的每个实例都有一个名为 root 的属性,它是某个 LinkedListNode。您可以在类定义中的任何位置使用和/或引用它。
当在其构造函数中创建 LinkedList 类的实例时,将指定根节点(我假设它存在于某处)。如果不是,则不会有任何对您创建的 LinkedList 的引用,它将几乎毫无用处。
为了回答问题的第二部分,你可以写这样一个函数,但没有必要。这将是多余的;您可以只使用对根节点的引用。