判断一个链表是否为回文结构

来源:互联网 发布:淘宝网店实战宝典txt 编辑:程序博客网 时间:2024/06/05 06:04
给定一个链表的头节点 head,请判断该链表是否为回文结构。
例如:
1->2->1,返回 true。
1->2->2->1,返回 true。
15->6->15,返回 true。
1->2->3,返回 false。

如果链表长度为 N,时间复杂度达到 O(N),额外空间复杂度达到 O(1)


public class IsPalindromeList{public static class Node{public int value;public Node next;public Node (int data){this.value = data;}}//需要n额外空间public static boolean isPalindromeList1(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 isPalindromeList2(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;}return true;}//需要O(1)额外空间public static boolean isPalindromeList(Node head){if(head == null || head.next == null){return true;}Node n1 = head;Node n2 = head;while(n2.next != null && n2.next.next != null){//找到中间节点n1 = n1.next;//n1指向中间节点n2 = n2.next.next;//n2指向末尾节点}n2 = n1.next;//n2指向右部分第一个节点n1.next = null;//中间节点下一节点指向空Node n3 = null;while(n2 != null){//右部分链表翻转n3 = n2.next;//n3用于保存下一节点n2.next = n1;//右部分节点翻转n1 = n2;//n1 移动n2 = n3;//n2 移动}n3 = n1;//n3 用于保存最后节点n2 = head;//n2指向左边第一个节点boolean res = true;while(n1 != null && n2 != null){if(n1.value != n2.value){res = false;break;}n1 = n1.next;//左->中n2 = n2.next;//右->中}n1 = n3.next;n3.next = null;while(n1 != null){//恢复链表n2 = n1.next;n1.next = n3;n3 = n1;n1 = n2;}return res;}}