2016-03-13 1 views
-2
def absorb_value(lnk, value): 
    """ (LinkedList, int) -> NoneType 
    >>> lnk = LinkedList() 
    >>> lnk.append(6) 
    >>> lnk.append(7) 
    >>> lnk.append(8) 
    >>> lnk.append(7) 
    >>> print(lnk.front) 
    6 -> 7 -> 8 -> 7 ->| 
    >>> absorb_value(lnk, 7) 
    >>> print(lnk.front) 
    6 -> 15 -> 7 ->| 
    >>> absorb_value(lnk, 6) 
    >>> print(lnk.front) 
    21 -> 7 ->| 
    """ 
    if lnk.front: 
     prev_node, cur_node = None, lnk.front 
     while cur_node and not cur_node.value == value: 
      prev_node = cur_node 
      cur_node = cur_node.next_ 
     if cur_node and cur_node.next_: 
      cur_node.next_.value += value 
      if prev_node: 
       prev_node.next_ = cur_node.next_ 
      else: 
       lnk.front = cur_node.next_ 
      lnk.size -= 1 
     else: 
      pass 
    else: 
     pass 

Il ya une solution que j'ai, je comprends la plupart des codes, mais je ne sais pas comment il a changé le lien d'origine.Confus au sujet des noeuds

prev_node.next_ = cur_node.next_ 

Ici, je ne comprends pas que la façon dont ce code fonctionne, il n'y a pas de code sur les lnk, mais pourquoi lnk pourrait être changé par elle?

Répondre

0

La ligne à laquelle vous faites référence à la fin de votre question coupe cur_node dans la liste chaînée. Il n'a pas besoin de modifier lnk directement parce qu'il y aura une chaîne d'autres liens menant à prev_node de lnk, de sorte que la modification de la liste sera visible.

Je note que toute l'affaire prev_node me semble inutile. Il serait plus facile de modifier cur_node.value et de supprimer cur_node.next_ de la liste, plutôt que de supprimer cur_node après avoir modifié cur_node.next_.value. (Peut-être y a-t-il un cas d'angle auquel je ne pense pas, les instructions pass sont-elles censées être remplacées par du code supplémentaire?)