파이썬에서 링크 된 목록을 재귀 적으로 바꾸는 알고리즘에 문제가 있습니다.역순으로 목록을 역순으로 연결
def reverse(lis, prev = None):
if lis.next != None:
reverse(lis.next, lis)
lis.next = prev
입력 : 3 1 4
출력 : 어떤 생각이 왜 3
작동하지 그것?
파이썬에서 링크 된 목록을 재귀 적으로 바꾸는 알고리즘에 문제가 있습니다.역순으로 목록을 역순으로 연결
def reverse(lis, prev = None):
if lis.next != None:
reverse(lis.next, lis)
lis.next = prev
입력 : 3 1 4
출력 : 어떤 생각이 왜 3
작동하지 그것?
문제는 연결된 목록의 루트뿐만 아니라 변경된 것입니다 : 목록을 변경 한 후, 당신의 요소 3
실제로 마지막 요소이며, 함수 더 나은 반환 루트뿐만 아니라 :
def reverse(lis, prev = None):
if lis.next != None:
temp = lis.next
lis.next = prev
return reverse(temp, lis)
else:
return lis # the new root
그래서 지금 당신은 그것을 전화 :
oldroot = ... #construct linked list
newroot = reverse(oldroot)
print(newroot)
그래서 함수가 정확하지만 수술 후 당신의 손에 잘못 연결리스트 요소를 가지고있다.
이 일부 함수형 프로그래밍 연습처럼 보이는, 그래서 나는 당신에게 기능 솔루션 (그것을 복사 목록) 현재 : 대신 새 체인을 만드는 대신에
def reverse(link, rest=None):
if link is None:
return rest
return reverse(link.next, LinkedList(link.value, rest))
class LinkedList:
def __init__(self, value=None, next=None):
self.next = next
self.value = value
def print(self):
print(self.value)
if self.next is not None:
self.next.print()
def to_linked_list(items):
if len(items) == 0:
return None
return LinkedList(items[0], to_linked_list(items[1:]))
to_linked_list([1, 2, 3, 4, 5]).print()
# 1, 2, 3, 4, 5
reverse(to_linked_list([1, 2, 3, 4, 5])).print()
# 5, 4, 3, 2, 1
기능적 해결책을 제시해 주셔서 감사합니다. 한가지 충고는'.print' 메서드 대신'__str__' 함수를 오버라이드하는 것입니다. 하지만 +1! –
:
def reverse_linked_list(node, prev=None):
if node.next is None:
node.next = prev
return node
root_node = reverse_linked_list(node.next, node)
node.next = prev
return root_node
@RasmiRanjanNayak을 이 질문은 분명히 작동하지 않으며 코드 개선 방법에 대한 일반적인 조언은 필요 없지만 오작동을 수정하는 방법에 대해서는 codereview에 속하지 않습니다 **. – Paul