请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
思路:
可以使用快慢指针和栈的数据结构来解决此题,一开始慢指针和快指针同时指同第一个节点,然后慢指针每次前进一步,快指针每次前进两步,慢指针前进时把扫过的元素值都入栈,等到快指针走到链表末尾,则回文链表的前半部分的元素值都已入栈,这时开始进行出栈操作,慢指针继续前进,每前进一步将当前的值与刚出栈的元素值进行比较,如果值相等,则指针继续前进并比较下一个,不相等则返回false(不是回文链表),如果慢指针走到了链表末尾且栈里的元素已全部出栈(栈变为空),则该链表是回文链表,返回true。
代码实现
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
//链表为空或链表只有一个节点返回true
if (head == null || head.next == null) {
return true;
}
//慢行指针
ListNode slow = head;
//快行指针
ListNode fast = head;
Stack stack = new Stack();
while (fast != null) {
if (fast.next == null) {
//节点个数若为奇数,慢行指针还要往后再移一个位置
// 然后继续与出栈元素进行比较
slow = slow.next;
break;
}
//回文链表的前半部分入栈
stack.push(slow.val);
//前进一步
slow = slow.next;
//前进两步
fast = fast.next.next;
}
while (slow != null) {
//值与出栈元素不相同(不对称),返回false
if ((int) stack.pop() != slow.val) {
return false;
} else {
//继续往下比较
slow = slow.next;
}
}
//最终栈不为空返回false
if (!stack.isEmpty()) {
return false;
}
//栈为空说明链表的元素是对称的,为回文链表,返回true
return true;
}
}