【题目】 给定一个链表的头节点head,请判断该链表是否为回
文结构。 例如: 1->2->1,返回true。 1->2->2->1,返回true。
15->6->15,返回true。 1->2->3,返回false。
方式一:
遍历链表,依次把每一个节点都压入一个栈中,完成之后,栈中的节点和原来的链表的节点是逆序的
从栈中取出节点与链表的节点进行依次的比较,即可得出结论.
方式二:
遍历列表,得到链表的中点节点,中点节点以后的节点如同方式一一样依次压入一个栈中,从栈中依次取出的节点刚好是和前段部分的顺序是一样的,进行比较即可得出结论.
方式三:
设置两个指针,一个快,一个慢,找到中点以后,让中点的指针指向null,让中点以后的节点逆序(改变指针指向即可),从两边的头结点分别开始向中间移动比较,比较完后,恢复后半段的顺序
package struct;
import java.util.Stack;
public class IsPalindromeList {
public static class Node {
public int value;
public Node next;
public Node(int data) {
this.value = data;
}
}
//方式一:需要N的额外空间
public static boolean isPalindrome1(Node head) {
Stack<Node> stack = new Stack<Node>();
Node cur = head;
while (cur != null) {
stack.push(cur);
cur = cur.next;
}
while (head != null) {
if (head.value != stack.pop().value) {
return false;
}
head = head.next;
}
return true;
}
//方式二:需要N/2的额外空间
public static boolean isPalindrome2(Node head) {
if (head == null || head.next == null) {
return true;
}
Node right = head.next;
Node cur = head;
while (cur.next != null && cur.next.next != null) {
right = right.next;
cur = cur.next.next;
}
Stack<Node> stack = new Stack<Node>();
while (right != null) {
stack.push(right);
right = right.next;
}
while (!stack.isEmpty()) {
if (head.value != stack.pop().value) {
return false;
}
head = head.next;
}