Python程式:從連結串列中刪除m個節點後的n個節點


假設我們給定一個連結串列,其起始節點為“head”,以及兩個整數m和n。我們需要遍歷連結串列並刪除一些節點,例如保留連結串列的前m個節點,並刪除前m個節點後的n個節點。我們執行此操作,直到遇到連結串列的末尾。我們從頭節點開始,需要返回修改後的連結串列。

連結串列結構如下所示:

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

因此,如果輸入類似於 elements = [1, 2, 3, 4, 5, 6, 7, 8],m = 3,n = 1,則輸出將為 [1, 2, 3, 5, 6, 7, ]

在此過程中,刪除3個節點後的每個節點,因此最終連結串列將如下所示:

為了解決這個問題,我們將遵循以下步驟:

  • prev := head

  • curr := head

  • q := 0

  • p := 0

  • 當 curr 不為空時,執行以下操作:

    • q := q + 1

    • 如果 q 等於 m,則執行以下操作:

      • 對於 i 從 0 到 n,執行以下操作:

        • 如果 curr.next 不為空,則執行以下操作:

          • curr := curr 的下一個節點

      • prev 的下一個節點 := curr 的下一個節點

      • q := 0

    • prev := prev 的下一個節點

    • curr := curr 的下一個節點

  • 返回 head

示例(Python)

讓我們看看以下實現,以更好地理解:

 線上演示

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,]

更新於: 2021年5月17日

259 次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

立即開始
廣告