Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมตรวจสอบรายการที่เชื่อมโยง กำลังสร้าง palindrome หรือไม่ใน Python


สมมติว่าเรามีรายการเชื่อมโยง เราต้องตรวจสอบว่าองค์ประกอบรายการกำลังก่อตัวเป็นพาลินโดรมหรือไม่ ดังนั้นหากองค์ประกอบรายการเป็นเหมือน [5,4,3,4,5] นี่คือพาลินโดรม แต่รายการอย่าง [5,4,3,2,1] ไม่ใช่พาลินโดรม

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • เร็ว :=หัว, ช้า :=หัว, รอบ :=ไม่มีและตั้งค่าสถานะ:=1
  • ถ้า head ว่าง ก็คืนค่า true
  • ในขณะที่ fast และ next of fast พร้อมใช้งาน
    • หากมีรายการถัดไปของ fast ถัดไป ให้ตั้งค่าแฟล็ก :=0 และทำลายลูป
    • เร็ว :=ถัดไปจากถัดไปอย่างรวดเร็ว
    • temp :=ช้า ช้า :=ถัดจากช้า
    • ถัดไปของ temp :=rev และ rev :=temp
  • เร็ว :=ถัดไปจากช้า และถัดไปของช้า :=rev
  • หากตั้งค่าสถานะไว้ ให้ช้า :=ถัดจากช้า
  • ทั้งที่เร็วและช้าไม่ใช่ไม่มี
    • ถ้าค่า fast ไม่เท่ากับค่า slow ให้คืนค่าเท็จ
    • เร็ว :=ถัดจากเร็วและช้า :=ถัดจากช้า
  • คืนค่าจริง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

class ListNode:
   def __init__(self, data, next = None):
      self.data = 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
class Solution(object):
   def isPalindrome(self, head):
      fast,slow = head,head
      rev = None
      flag = 1
      if not head:
         return True
      while fast and fast.next:
         if not fast.next.next:
            flag = 0
            break
      fast = fast.next.next
      temp = slow
      slow = slow.next
      temp.next = rev
      rev = temp
      fast = slow.next
      slow.next = rev
      if flag:
         slow = slow.next
         while fast and slow:
            if fast.data != slow.data:
               return False
      fast = fast.next
      slow = slow.next
      return True
      head = make_list([5,4,3,4,5])
ob1 = Solution()
print(ob1.isPalindrome(head))

อินพุต

[5,4,3,4,5]

ผลลัพธ์

True