Advertisement
Alexxik

Untitled

Sep 14th, 2023 (edited)
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 2.28 KB | None | 0 0
  1. // MARK: - 234. Palindrome Linked List
  2.  
  3. //public class ListNode {
  4. //    public var val: Int
  5. //    public var next: ListNode?
  6. //    public init() { self.val = 0; self.next = nil; }
  7. //    public init(_ val: Int) { self.val = val; self.next = nil; }
  8. //    public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
  9. //}
  10.  
  11. func isPalindrome(_ head: ListNode?) -> Bool {
  12.    
  13.     // 1
  14.     // Нужно найти середину связанного списка. Метод быстрого и медленного указателей
  15.     // Медленный курсор будет идти на 1 шаг, Быстрый - на 2 шага
  16.     // Когда быстрый курсор дойдет до конца списка, медленный дойдет до половины списка
  17.    
  18.     var slow = head
  19.     var fast = head
  20.    
  21.     // этими условиями обрабатываем четность и нечетность линкед листа
  22.     while fast != nil && fast?.next != nil {
  23.         slow = slow?.next
  24.         fast = fast?.next?.next
  25.     }
  26.    
  27.     // теперь slow на середине
  28.    
  29.     //2
  30.     // Нужно взять дальнюю половину и развернуть
  31.     // Так, от головы элементы будут идти как и шли до центрального элемента
  32.     // Указатель будет в самом конце обновленного списка и мы сможеи пройти к середине сравнивая элементы
  33.    
  34.     var prev: ListNode?
  35.     while slow != nil {
  36.         var temp = slow?.next
  37.         slow?.next = prev
  38.         prev = slow
  39.         slow = temp
  40.     }
  41.    
  42.  
  43.     var left = head
  44.     // в prev будет последний элемент
  45.     var right = prev
  46.    
  47.     // Центральный элемент будет ссылаться на nil
  48.     // Когда правый указатель упрется в nil, то это будет означать что мы прошли до середины списка
  49.     while right != nil {
  50.         if left?.val != right?.val {
  51.             return false
  52.         }
  53.         left = left?.next
  54.         right = right?.next
  55.     }
  56.    
  57.     return true
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement