План курса / Все задачи / Алгоритмы и структуры данных
Палиндром
средне
# решено
Дана голова односвязного списка head. Необходимо определить, является ли список палиндромом. Если список является палиндромом, вернуть true, в противном случае — false.
Палиндромом считается тот список, который при развороте не изменяется.
Пример 1:
Ввод: head = [1,2,3,2,1]
Вывод: true
Пример 2:
Ввод: head = [1,2,3,4]
Вывод: false
Пример 3:
Ввод: head = [1]
Вывод: true
Ограничения:
len(head) >= 0
/**
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int val, ListNode next=null) {
* this.val = val;
* this.next = next;
* }
* }
*/
public class Solution {
public static ListNode MiddleNode(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public static ListNode ReverseList(ListNode head) {
ListNode curr = head;
ListNode prev = null;
while (curr != null) {
ListNode tmp = curr;
curr = curr.next;
tmp.next = prev;
prev = tmp;
}
return prev;
}
public static bool IsPalindrome(ListNode head) {
ListNode firstHalfEnd = MiddleNode(head);
ListNode secondHalfBegin = ReverseList(firstHalfEnd);
ListNode p1 = head;
ListNode p2 = secondHalfBegin;
while (p2 != null) {
if (p1.val != p2.val) {
return false;
}
p1 = p1.next;
p2 = p2.next;
}
return true;
}
}