请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
实现思路:
- 使用快慢两个指针,快指针每次走两个节点,慢指针每次走一个节点,fast走到链表末尾时,slow刚好走到正中间
- 同时在slow走到中间的过程中使用数组将每一个节点的值存起来
- 根据fast指针走到链表尾的情形判断为奇数还是偶数个
- slow指针继续往前走直至链表尾,将后半段链表每一个节点与数组中寸起来的前半段的链表元素值一一对比
代码实现:
if (head == null || head.next == null) return true;
ListNode L = new ListNode();
L.next = head; // 增加一个头结点,方便计算
ListNode slow = L, fast = L;
int cnt = 0; // cnt 为链表长度的一半
ArrayList<Integer> arrayList = new ArrayList<>();
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
cnt++;
arrayList.add(slow.val);
}
// System.out.println(cnt + "\t" + arrayList.toString() + "\t" + arrayList.get(2));
cnt = fast == null ? cnt -1 : cnt ; // 偶数项还是奇数项,如果是奇数项,先向后退一位
slow = slow.next; // 后半段与前半段来进行回文判断
while (slow != null) {
if (arrayList.get(--cnt) != slow.val) return false;
slow = slow.next;
}
return true;
}