給定一個鏈表的頭節點head, 請判斷該鏈表是否為回文結構。 例如: 1->2->1, 返回true。 1->2->2->1, 返回true。
15->6->15, 返回true。 1->2->3, 返回false。
進階: 如果鏈表長度為N, 時間復雜度達到O(N), 額外空間復雜度達到O(1)。
解法一:
使用快慢指針將slow指向的鏈表的一半壓入進棧中,然后slow繼續向后走,同時棧中彈出元素,對比
對於奇數個鏈表 1->2->3->2->1 slow指向3
對於偶數個鏈表 1->2->2->1 slow指向第一個2
需要的空間復雜度為O(N/2)
public static boolean isPalindrome1(Node node){ if(node == null || node.next == null) return true; Node fast = node; Node slow = node; Stack<Node> stack = new Stack<>(); boolean flag = true; while(fast.next != null && fast.next.next != null){ stack.push(slow); fast = fast.next.next; slow = slow.next; } slow = slow.next; if(stack.peek().val != slow.val){ slow = slow.next; } while(!stack.empty() && slow != null){ if(stack.pop().val != slow.val){ flag = false; break; } slow = slow.next; } if(flag && stack.empty() && slow == null){ return true; }else{ return false; } }
解法二:
使用快慢指針,找到鏈表的中點,將中點右邊的鏈表均反轉,然后兩頭重新遍歷,
對比,若有不同的則返回false,否則返回true
注意在返回之前,要將鏈表重新整理回原來的順序
1->2->3->2->1 變為 1->2->3<-2<-1