Инициализируйте два указателя: медленный и быстрый указатель, увеличивайте медленный на один и быстрый на два (как алгоритм нахождения цикла Флойда) на каждом шаге, передавая данные, на которые указывает медленный указатель, в стек, как только быстрый указатель становится равным разрыву NULL.петля.Запустите другой цикл, пока медленный не равен нулю и стек не равен NULL. Сравните stack.top с данными, на которые указывает медленный, если есть какое-либо несоответствие, список не является палиндромом.
Например:
1->2->2->1
Slow points to 0th pos
Fast points to 0th pos
1st Step:
Slow points to 1st pos
Fast points to 2nd pos
Stack has 1
2nd step
Slow points to 2nd pos
Fast goes to NULL
Stack has 1->2
Another loop while slow!=NULL
1st step
slow points to 3rd pos(Data=2 stack top=2, Match so pop from stack)
stack has 1
2nd step
slow points to 4th place (data =1 stack top =1 Match so pop from stack)
stack=NULL
break out
Since everything matches so is a palindrome
ALTERNATIVE,
Обратный список от первого узла до узла перед медленным указателем.Так что здесь это будет
1<-2 2->1
| |
head slow
of
the first half of the linked list
Теперь начните сравнение.