2012-10-26 5 views
0

파이썬에서 연결된 목록 클래스를 만들려고합니다. (무의미한 일이지만 학습 연습입니다.) 노드를 제거하기 위해 작성한 메서드가 작동하지 않습니다. 연결된 목록의 첫 번째 요소를 제거하려고하면. 제거 할 노드가 연결된 목록의 다른 위치에 있으면 메서드가 제대로 작동합니다. 누군가 내가 잘못한 부분에 대해 통찰력을 줄 수 있습니까? 코드에 나타낸 바와 같이링크 된 목록의 첫 번째 노드를 제거 할 수 없습니다.

class Node: 

    def __init__(self, data=None, next=None): 
     self.data = data 
     self.next = next 

    def __repr__(self): 
     return repr(self.data) 

    def printNodes(self): 
     while self: 
      print self.data 
      self = self.next 

    def removeNode(self, datum): 
     """removes node from linked list""" 
     if self.data == datum: 
      return self.next 
     while self.next: 
      if self.next.data == datum: 
       self.next = self.next.next 
       return self 
      self = self.next 
+0

예를 들어, 링크 된 목록 1,2,3,4가 있다고 가정 해 보겠습니다. removeNode (1)을 호출하면 결과는 1,2,3,4입니다. removeNode (3)을 호출하면 결과는 1,2,4입니다. – carlmonday

+0

'removeNode'의 결과를 다시 할당 하시겠습니까? 즉, 당신은'my_linked_list.removeNode (x)'또는'my_linked_list = my_linked_list.removeNode (x)'를합니까? –

+0

나는 이전을한다 – carlmonday

답변

1

항상 을 수정하여 링크 된 목록의 헤드를 반환하고 결과를 헤드 노드에 다시 할당합니다. 그래서 같이 :

def removeNode(self, datum): 
    """removes node from linked list and returns head node""" 
    head = self 
    curr_node = self 
    if curr_node.data == datum: 
     head = curr_node.next 
    else: 
     while curr_node.next: 
      if curr_node.next.data == datum: 
       curr_node.next = self.next.next 
       break 
      curr_node = curr_node.next 
    return head 

또는, 당신은 머리에 다시 removeNode의 결과를 할당 할 필요가 없도록하려는 경우 :

def removeNode(self, datum): 
    """removes node from linked list""" 
    curr_node = self 
    if curr_node.data == datum: 
     # steals the the data from the second node 
     curr_node.data = curr_node.next.data 
     curr_node.next = curr_node.next.next 
    else: 
     while curr_node.next: 
      if curr_node.next.data == datum: 
       curr_node.next = curr_node.next.next 
       break 
      curr_node = curr_node.next 

참고 : 잘못 생각하기 때문에 내가 curr_nodeself을 할당 수정 self.

0

removeNode 방법은 링크 목록의 새로운 첫 번째 노드를 반환

여기에 지금까지 내 코드입니다. 메서드를 호출하기보다는 head = head.removeNode(1)을 사용해야합니다.

+0

나는 처음에 이것을 생각했으나, 다음으로 목록에서 더 아래로 항목을 제거하는 코드를 깨뜨렸다. –

관련 문제