鏈表--判斷一個鏈表是否為回文結構


給定一個鏈表的頭節點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 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM