1. 程式人生 > 其它 >JAVA-牛客-判斷連結串列的迴文結構

JAVA-牛客-判斷連結串列的迴文結構

技術標籤:JAVA連結串列leetcodejava演算法

判斷連結串列的迴文結構

1.題目

對於一個連結串列,請設計一個時間複雜度為O(n),額外空間複雜度為O(1)的演算法,判斷其是否為迴文結構。

給定一個連結串列的頭指標A,請返回一個bool值,代表其是否為迴文結構。保證連結串列長度小於等於900。

測試樣例:
1->2->2->1
返回:true

2.分析

對於一個迴文連結串列可以發現,當指標節點在對其進行遍歷時,走到中間位置就等同於從中間倒著往前走
如 1->2->3->2->1,1->2->2->1

所以可以將中間以後的部分視為前半部分的反轉
因此可以將中間以後的部分進行反轉,就能得到一個和前半部分相同的連結串列,這也變成了判斷迴文結構的條件

3.程式碼示例

public class PalindromeList {
    public boolean chkPalindrome(ListNode A) {
        // write code here
        if(A==null||A.next==null){
            return false;
        }
        if(A.next.next==null){
            return
false; } //首先定義快慢指標得到連結串列的中間節點 ListNode slow = A; ListNode fast = A; while(fast!=null&&fast.next!=null){ slow=slow.next; fast=fast.next.next; } //從連結串列的中間開始反轉後續連結串列 ListNode tmp = slow; ListNode cur =
slow.next; ListNode curNext = cur.next; while(curNext!=null){ cur.next=tmp; tmp=cur; cur=curNext; curNext=curNext.next; } slow.next=null; cur.next=tmp; //逐個對比前半部分連結串列和後半部分連結串列的反轉 while(cur!=null){ if(cur.val!=A.val){ return false; } cur=cur.next; A=A.next; } return true; } }

在這裡插入圖片描述