题目:
给定链表的头节点,判断该链表是否为会问结构
给定链表的头节点,判断该链表是否为会问结构
如果链表的长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1)
方法一:
public class Node{ public int value; public Node next; public Node(int data){ this.value = data; } } public boolean isPalindromel(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; }
方法二:
public boolean isPalindromel2(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; } } return true; }
方法三:
public boolean isPalindromel3(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; n2 = n2.next.next; } n2 = n1.next; n1.next = null; Node n3 = null; while(n2 != null){ n3 = n2.next; n2.next = n1; n1 = n2; n2 = n3; } n3 = n1; n2 = head; 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; }