2013-11-09 2 views
0

내 작업은 연결된 목록에서 첫 번째 값을 제거하는 것입니다. 값은 사용자가 입력합니다. 그런 다음 항목이 제거되었는지 (True) 또는 값이 연결된 목록에 없는지 나타내는 False를 반환하는 부울 값을 반환해야합니다. 이것은 내가 지금까지 가지고있는 것이다.재귀를 사용하여 연결된 목록에서 값을 제거하려면

def remove(lst, value): 
    lst.head = removeRec(lst.head, value) 

def removeRec(node, value): 
    if isinstance(node, EmptyNode): 
     print("Cannot remove value from an empty list") 
    elif node.data == value: 
     return node.next 
    elif: 
     node.next = removeRec(node.next, value) 
     return node 
    else: 
     return False 

이 문제는 항목이 제거 된 경우 True를 반환하지 않는다는 점입니다. 어떻게 구현할 수 있습니까? 또한 비슷한 함수를 반복적으로 구현하는 방법은 무엇입니까? 고마워.

답변

2

에게 "파이썬"방법을 반환하지 않습니다 예외를 발생시킵니다. 이 코드는 매우 간단합니다 :

def removeRec(node, value): 
    if isinstance(node, EmptyNode): 
     raise ValueError("Cannot remove value from an empty list") 
    elif node.data == value: 
     return node.next 
    else: 
     node.next = removeRec(node.next, value) 
     return node 

이 호출 코드에서 예외를 처리하는 호출자에두고, 기존 remove 기능이 작동합니다.당신이 성공 또는 실패를 나타내는 부울 값을 반환하는 remove 기능을 원하는 경우, 당신이 거기를 제외하고 잡을 수있다 : 어떤 이유로 예외를 사용에 대해 당신이 경우 죽은 세트를

def remove(lst, value): 
    try: 
     lst.head = removeRec(lst.head, value) 
     return True # only reached if no exception was raised by the recursion 
    except ValueError: 
     return False 

를 (예 :에있는 것으로 당신이 아직 가르쳐주지 않은 클래스)에서 재귀 호출의 반환 값에서 제거 실패를 인코딩 할 수 있지만 목록을 손상시키지 않으려면 추가 검사를해야합니다.

def removeRec(node, value): 
    if isinstance(node, EmptyNode): 
     print("Cannot remove value from an empty list") 
     return None # your code did this implicitly, I'm being explicit 
    elif node.data == value: 
     return node.next 
    else: 
     rec_result = removeRec(node.next, value) 
     if rec_result is None: 
      return rec_result 
     else: 
      node.next = rec_result 
      return node 

그런 다음 비 재귀 함수에서 재귀 적 경우와 동일한 검사를 수행하고 결과 값을 bool로 바꿀 수 있습니다 EAN은 :

def remove(lst, value): 
    rec_result = removeRec(lst.head, value) 
    if rec_result is None: 
     return False 
    else: 
     lst.head = rec_result 
     return True 
+0

아주 좋은 대답! –

1

당신은 당신의 기지 사례

  1. 값이리스트의 선두에있다로 시작해야
  2. 값은
  3. 값이 중간에있는 목록의 끝에 목록
  4. 값 때문에 당신이 종료 값을 동일하게 처리 할 수 ​​있습니다 대부분의 목록의 특성

지금 목록에없는이 워싱턴 마치 목록

의 중간에 S 그래서 정말 우리는 값이

  • 값이 목록에
  • 다른 모든 경우
  • 없는 목록의 머리에있다

    1. 을 기본 사례로 사용하여 기본 사례를 이해 했으므로 이제 함수를 작성할 수 있습니다.

      def removeRec(node,value): 
          if node.value == value: #only time this will happen is if the node is at the head 
           node.value = node.next.value 
           node.next = node.next.next 
           #you cannot simply say node= node.next since then it will not propagate to the actual list 
           return True # found and removed value 
          if node.next == None: #case where value is not in the list 
           return False #unable to remove 
          if node.next.value == value: 
           node.next = node.next.next 
           return True #successfully removed 
          return removeRec(node.next,value)#recursively continue searching 
      
      ,

      노드 목록이 바로 업데이트됩니다 변경 가능한 객체이기 때문에 ... 그것은 당신이 당신이해야했다 무엇을 달성하는 데 실패했다고보고 새 목록

    +1

    에 중복이 할 수있는 유용한 것은 아닐 것입니다, 확실히. – Blckknght

    +0

    지금은 그다지 ... 그리고 node.next 실제로 삭제 된 하나입니다, 그러나 모든 집중적 인 목적을 위해 그것은 노드입니다 –

    0

    나는 그것을 좋아 할 것 : 경우에

    def remove(lst, value): 
        remove.ret = False 
    
        def removeRec(node, value): 
         if isinstance(node, EmptyNode): 
          print("Cannot remove value from an empty list") 
         elif node.data == value: 
          remove.ret = True 
          return node.next 
         else: 
          node.next = removeRec(node.next, value) 
          return node 
    
        lst.head = removeRec(lst.head, value) 
        return remove.ret 
    
    0

    는 글로벌 헤드 노드를 사용하여 LinkedList의

    def removeLinkedList(node, value): 
        if not node: 
         return node 
        elif node.val == value: 
         return removeLinkedList(node.next,value) 
        else: 
         node.next = removeLinkedList(node.next, value) 
         return node 
    
    관련 문제