Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình đảo ngược các nút bên trong của danh sách được liên kết trong python

Giả sử chúng ta có danh sách liên kết, chúng ta cũng có hai giá trị i và j, chúng ta phải đảo danh sách liên kết từ nút thứ i đến nút thứ j. Và cuối cùng trả lại danh sách đã cập nhật.

Vì vậy, nếu đầu vào là [1,2,3,4,5,6,7,8,9] i =2 j =6, thì đầu ra sẽ là [1, 2, 7, 6, 5, 4 , 3, 8, 9,]

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau:

  • prev_head:=tạo một nút danh sách được liên kết có giá trị giống như null và trỏ đến nút
  • prev:=pres_head, curr:=node
  • lặp qua tất cả các giá trị từ 0 đến i, thực hiện
    • prev:=curr, curr:=next of curr
  • rev_before:=prev, rev_end:=curr
  • Lặp lại tất cả các giá trị từ 0 đến (j - i), thực hiện
    • tmp:=next of curr
    • tiếp theo của curr:=trước
    • prev, curr:=curr, tmp
  • tiếp theo của rev_before:=trước, rev_end.next:=curr
  • quay lại tiếp theo của trước sau_head

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn:

Ví dụ

class ListNode:
   def __init__(self, data, next = None):
      self.val = data
      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(']')

class Solution:
   def solve(self, node, i, j):
      prev_head = ListNode(None, node)
      prev, curr = prev_head, node

      for _ in range(i):
         prev, curr = curr, curr.next
   
      rev_before, rev_end = prev, curr

      for _ in range(j - i + 1):
         tmp = curr.next
         curr.next = prev
         prev, curr = curr, tmp

      rev_before.next, rev_end.next = prev, curr

      return prev_head.next

ob = Solution()
head = make_list([1,2,3,4,5,6,7,8,9])
i = 2
j = 6
print_list(ob.solve(head, i, j))

Đầu vào

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

Đầu ra

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