题目描述:
Given a singly linked list, determine if it is a palindrome.
Example 1:
Input: 1->2
Output: false
Example 2:
Input: 1->2->2->1
Output: true
Follow up:
Could you do it in O(n) time and O(1) space?
题目分析:
题目很明确,给定一个链表,判断其是否是回文链表。回文回文,顾名思义,即是顺着看和倒着看都是一样的,从这定义来看,最简单的方法就是对原链表进行反转,看反转后的链表与原链表是否相同。不过这样需要对整个链表进行反转,能否对其有所优化呢?再从回文的定义来看,既然顺着看和倒着看都一样,那么说明其是对称的,对于链表来说,就是链表的中间结点左右都是相同的。考虑到这点,就不难想出优化方法:只需遍历到中间结点,对链表中间结点前的部分进行反转,然后再从中间结点向两边遍历,如果一样,那么就说明链表两边是对称的,即是该链表是回文链表了。
因此这里首先是要找到中间结点,找中间结点最简单的方法是用一对快慢指针,初始化指向第一个结点,慢指针步长为1,快指针步长为2,如果链表长度为偶数,中间结点是不存在的,那么当快指针遍历到末尾(NULL)时,说明慢指针遍历到了第n/2+1个结点(n为链表长度);如果链表长度为奇数,那么当快指针指向的结点的下一个结点为NULL时,