Algorithm - reverseNodesInKGroups(head, k)
          
             
  최대 1 분 소요
          
        
      
      
        
         
        
        
        
        Problem
  - linked list를 k 개만큼씩 끊고 각자 reversing하여 다시 연결해주는 함수를 말한다.
 
example
  - reverseNodesInKGroups([1,2,3,4], 2) ==> [2,1,4,3]
 
  - reverseNodesInKGroups([1,2,3,4], 3) ==> [3,2,1,4]
 
solution
split_k(head, k)
  - 우선 linked list를 k 크기의 linked list와 나머지 linked list로 분할하여 리턴하는 함수를 만들었다.
 
def split_k(head, k):
    if head is None:
        return None, None
    cursor = head
    new_head = None
    for i in range(1, k):
        if cursor.next is None:
            return head, None
        else:
            cursor = cursor.next
    new_head = cursor.next
    cursor.next = None
    return head, new_head
 
ReversedLinkedList(head)
def ReversedLinkedList(head):
    new_head = None
    while True:
        temp = head  
        head = temp.next
        temp.next = new_head
        new_head = temp
        if head==None:
            break
    return new_head
 
tail(head)
  - 가장 끝에 있는 element를 리턴하는 함수
 
def tail(head):
    cursor = head
    while cursor.next:
        cursor=cursor.next
    return cursor
 
length(l)
def length(l):
    i = 0
    cursor = l 
    while cursor:
        i+=1
        cursor=cursor.next
    return i
 
reverseNodesInKGroups(l, k)
  - split_k를 이용하여 linked list를 둘로 쪼갠다.
 
  - 앞의 list의 경우 reversing.
 
  - 연속적으로 수행하며, 연결해준다.
 
def reverseNodesInKGroups(l, k):
    r_head, new_head = split_k(l, k)
    r_head = ReversedLinkedList(r_head)
    while True:
        head, new_head = split_k(new_head, k)
        if new_head is None:
            if length(head)==k:
                tail(r_head).next = ReversedLinkedList(head)
            else:
                tail(r_head).next = head
            break
        tail(r_head).next = ReversedLinkedList(head)
    return r_head
 
        
      
      
      
      
  
     
    
      
    
  
댓글남기기