【Leetcode】面试题 02.06. 回文链表
题目
编写一个函数,检查输入的链表是否是回文的。
思路
- 采用快慢两个指针寻找链表的中间节点
- 根据链表的中间节点反转后一半的链表
- 比较前一半元素和后一半元素 如果节点值相等 那就是回文链表
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
// 采用快慢两个指针寻找链表的中间节点
// 根据链表的中间节点反转后一半的链表
// 比较前一半元素和后一半元素 如果节点值相等 那就是回文链表
if(head == null)
{
return true;
}
ListNode midNode = findMidNode(head);// 查找中间节点
// 反转后半部分链表
ListNode halfNode = reverseLinked(midNode.next);
ListNode p = head;
ListNode q = halfNode;
boolean flag = true;
while(q != null)
{
if(p.val != q.val)
{
flag = false;
break;
}
p = p.next;
q = q.next;
}
return flag;
}
// 反转链表
public ListNode reverseLinked(ListNode head)
{
// 双指针 反转链表
ListNode cur = head;
ListNode pre = null;
while(cur != null)
{
// 设置临时节点 保存下一个节点
ListNode tmp = cur.next;
cur.next = pre;// 链表反转
pre = cur;
cur = tmp;
}
return pre;
}
// 快慢指针寻找链表中间节点
public ListNode findMidNode(ListNode head)
{
// 快指针走两步 慢指针走一步 这样的话 快指针走到末尾 慢指针走到中间
ListNode fast = head;
ListNode slow = head;
while(fast.next != null && fast.next.next != null)
{
fast = fast.next.next;// 快指针走两步
slow = slow.next;// 慢指针走一步
}
return slow;// 慢指针走到中间
}
}