2015-02-10 64 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