引言
判断链表是不是回文数。给定一个链表,判断是不是回文数,返回true或者false。
思路
链表代码
public static class Node{
public int value; //值
public Node next; // 下一个节点
public Node(int value) {
this.value = value;
}
}
一、使用栈来进行比较,把所有元素都压入栈,然后弹出栈进行比较。时间复杂度O(n),空间复杂度O(n)。
实现代码
public static boolean isPalindromeOne(Node node){
Stack<Node> stack = new Stack<>();
Node cur = node;
// 节点不为null 都压入栈
while (cur != null) {
stack.push(cur);
cur = cur.next;
}
// 弹出栈进行比较
while (node != null) {
if(node.value != stack.pop().value){
return false;
}
node = node.next;
}
return true;
}
二、使用快慢指针,快指针每次走两步,慢指针每次走一步。当快指针到达终点的时候,慢指针在中间的位置。把中间到后面的位置压入栈,从头开始比较。这样比思路一少压入一半节点。时间复杂度O(N) 空间复杂度O(N)
实现代码
public static boolean isPalindromeTwo(Node node){
if (node == null || node.next == null) {
return true;
}
Stack<Node> stack = new Stack<>();
// 快指针
Node fast = node;
// 慢指针
Node slow = node;
// 快指针在终点位置的时候,慢指针在中间位置
while(fast.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
}
// 把慢指针后面的位置压入栈
while (slow != null){
stack.push(slow);
slow = slow.next;
}
// 弹出栈进行比较
while (!stack.isEmpty()){
if(stack.pop().value !=