从单链表中删除时如何获取根节点

时间:2011-05-08 22:01:13

标签: c# linked-list root

我想知道这个函数在尝试从单个链表中删除节点时如何获取根节点。我理解整个删除部分。

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;
    }
}

2 个答案:

答案 0 :(得分:0)

我不确定我理解这个问题......

LinkedListNode root是类LinkedList的私有成员,可能是在构造函数中和/或AddNode函数中的其他位置初始化的。成员root初始化后(并引用列表的根节点),允许DeleteNode等函数使用它,例如 if( root.data.equals(obj) ) { root = root.next; }

我希望这有点帮助...

答案 1 :(得分:0)

这不是自动的。 “root”是LinkedList类的类变量,也就是说LinkedList类的每个实例都有一个名为root的属性,它是一些LinkedListNode。您可以在类定义中的任何位置使用和/或引用它。

在创建LinkedList类的实例时,将在其构造函数(我假设存在于某处)中指定根节点。如果不是,则不会对您创建的LinkedList有任何引用,它将完全没用。

要回答问题的第二部分,你可以编写这样的函数,但没有必要。这将是多余的;你可以使用对根节点的引用。