Cracking the Coding Interview/Linked Lists
[Coding Interview] 링크드 리스트에서 중복된 자료 삭제하기
Mr. K
2014. 8. 14. 15:06
"""
코딩 인터뷰 문제를 파이썬으로 구현한 글입니다.
예제 코드에 버그가 있거나 더 나은 방법의 의견교환은 환영입니다.
"""
FOLLOW UP
How would you solve this problem if a temporary buffer is not allowed?
싱글 링크드 리스트에서 중복된 자료를 삭제하는 알고리즘
#노드 생성 클래스 class Node(object): def __init__(self, data=None): self.data = data self.next = None #링크드 리스트를 set 으로 변환하여 중복값 제거 #O(1) 의 실행 복잡도, BUT 추가 버퍼 필요 def remove_duplicate(node=Node()): _tmp_set = set() while node: _tmp_set.update([node.data]) node = node.next print _tmp_set #추가 버퍼 필요없음. 단, O(N^2)의 시간 복잡도 def remove_duplicate_no_buffer(node=Node(), head=Node()): while node and node.next: if node.data is node.next.data: if node.next.next: node.next = node.next.next else: node.next = None remove_duplicate_no_buffer(head, head) node = node.next #노드 출력 def print_list(node=Node()): _tmp_array = list() while node: _tmp_array.append(node.data) node = node.next print _tmp_array #테스트 def test_node(): node1 = Node(1) node2 = Node(1) node3 = Node(1) node4 = Node(2) node5 = Node(2) node1.next = node2 node2.next = node3 node3.next = node4 node4.next = node5 remove_duplicate() #if null remove_duplicate(node1) remove_duplicate_no_buffer(node1, node1) print_list(node1) test_node()