2015-02-10 61 views
0
class Node: 
    def __init__(self, data): 
    self.data = data 
    self.next = None 

class LinkedList: 
    def __init__(self, head=None): 
    self.head = head 

    def insert(self, node): 
    if not self.head: 
     self.head = node 
    else: 
     node.next = self.head 
     self.head = node 

    def search(self, node): 
    if self.head == node: 
     return self.head 
    else: 
     if self.head.next: 
     self.head = self.head.next 
     return self.search(node) 

我有一种感觉,重置头head.next是不完全正确的。如果不是,我的递归函数如何移动到下一个节点?这是链表中递归搜索函数的正确实现吗?

回答

0

重置头部肯定是错误的,您将以这种方式丢失链接列表。对于第一个搜索调用,你需要指定从哪里开始,然后检查接下来要检查的节点(如果有的话):

def search(self, node, next_node=None): 
    if next_node is None: 
     next_node = self.head 
    if next_node == node: 
     return next_node 
    elif next_node.next is None: 
     return None 
    else: 
     return self.search(node, next_node.next) 
+0

我不是很了解next_node是如何传递给else语句的?你能进一步解释吗? – yesyoukenn 2015-02-10 03:38:56

+0

搜索方法的第二个参数是要检查的下一个节点,即head.next,head.next.next,head.next.next等。当你从课堂外调用next_node时没有,这是一个你需要设置它的信号。顺便说一下,直接比较节点可能不会工作,你需要'如果next_node.data == node.data:return next_node' – peter 2015-02-10 03:43:14

+0

我应该在第一个if if块中添加next_node有效地创建一个新变量,但是由于python范围规则它在方法体内是可见的。 – peter 2015-02-10 03:51:25