Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python의 연결 목록에서 m개 노드 다음의 n개 노드를 삭제하는 프로그램

<시간/>

시작 노드가 "head"이고 두 개의 정수 m과 n이 있는 연결 목록이 있다고 가정합니다. 우리는 목록을 순회하고 처음 m개의 노드가 목록에 유지되고 처음 m개의 노드가 삭제된 후 다음 n개의 노드와 같은 일부 노드를 삭제해야 합니다. 연결 리스트가 끝날 때까지 이 작업을 수행합니다. 헤드 노드에서 시작하여 수정된 연결 목록이 반환됩니다.

연결 리스트 구조는 다음과 같이 주어집니다. -

Node
   value : <integer>
   next : <pointer to next node>

따라서 입력이 요소 =[1, 2, 3, 4, 5, 6, 7, 8], m =3, n =1인 경우 출력은 [1, 2, 3, 5, 6입니다. , 7, ]

Python의 연결 목록에서 m개 노드 다음의 n개 노드를 삭제하는 프로그램

이 과정에서 3개의 노드 이후의 모든 노드가 삭제되므로 결국 연결 리스트는 아래와 같이 됩니다. -

Python의 연결 목록에서 m개 노드 다음의 n개 노드를 삭제하는 프로그램

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 이전 :=머리

  • 커 :=머리

  • q :=0

  • 피 :=0

  • curr이 null이 아닌 동안 수행

    • q :=q + 1

    • q가 m과 같으면

      • 0에서 n 사이의 i에 대해 수행

        • curr.next가 null이 아니면

          • curr :=curr의 다음

      • 이전의 다음 :=현재의 다음

      • q :=0

    • prev :=이전의 다음

    • curr :=curr의 다음

  • 머리 반환

예제(파이썬)

더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −

class ListNode:
   def __init__(self, val=0, next=None):
      self.val = val
      self.next = next

def make_list(elements):
   head = ListNode(elements[0])
   for element in elements[1:]:
      ptr = head
      while ptr.next:
         ptr = ptr.next
      ptr.next = ListNode(element)

   return head

def print_list(head):
   ptr = head
   print('[', end = "")
   while ptr:
      print(ptr.val, end = ", ")
      ptr = ptr.next
   print(']')

def solve(head, m, n):
   prev = curr = head
   q = 0
   p = 0

   while curr:
      q += 1
      if q == m:
         for i in range(n):
            if curr.next is not None:
               curr = curr.next
         prev.next = curr.next
         q = 0

      prev = prev.next
      curr = curr.next

   return head

head = ListNode()
elements = [1, 2, 3, 4, 5, 6, 7, 8]
head = make_list(elements)
res = solve(head, 3, 1)
print_list(res)

입력

[1, 2, 3, 4, 5, 6, 7, 8], 3, 1

출력

[1, 2, 3, 5, 6, 7,]