32 回文鍊錶

2021-09-24 10:38:07 字數 1164 閱讀 3660

解析:

1.利用棧求解

①首先遍歷鍊錶獲取鍊錶的長度len;

②根據鍊錶的長度,將鍊錶的前半部分壓入棧,將後半部分依次與彈棧的元素比較看是否一致,一致則為回文鍊錶;

③這裡注意的是鍊錶的後半部分的開始位置(鍊錶長度的奇偶)。

public boolean ispalindrome1(listnode head) 

//前半部分壓入棧

stackstack = new stack();

int mid = len/2;

if (len%2 == 0)

//注意區分mid--和--mid時遍歷停止時的first指向的結點

//鍊錶長度是偶數,此時first表示鍊錶後半部分的開始

}else

first = first.next;

//鍊錶長度是奇數,此時first表示鍊錶後半部分的開始

}//後半部分與棧中元素比較

while (first!=null)

return true;

}

2.雙指標—鍊錶反轉

①定義兩個指標p1和p2,開始同時指向頭結點;

②指標p1和p2同時移動,p1移動乙個節點,p2移動兩個結點,當p2移動到鍊錶的末尾無法在移動時,此時p1剛好指向鍊錶的中間結點;

例:1->2->2->1 p1停留在第乙個結點2上

1->2->3->2->1 p1停留在結點3上

③進行反轉p1後面的部分鍊錶操作;

④比較前半部分的鍊錶和反轉的後半部分鍊錶。(從上述例中明顯可以看出,不區分鍊錶的奇偶)

public boolean ispalindrome2(listnode head) 

//反轉此時p1之後的鍊錶

//不用考慮鍊錶的奇偶

listnode pre = null, curnode = null, tmpnode = p1.next;

while (tmpnode != null)

p1.next = pre;//接上反轉後的鍊錶

//比較前半部分和反轉後的部分是否一致

while(pre != null)

return true;

}

234 回文鍊錶

請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2輸出 false示例 2 輸入 1 2 2 1輸出 true首先建立兩個指標指向鍊錶,然後使其中乙個指標指向鍊錶中間,這裡可以使用另乙個指標快速移動,當另乙個指標移動速度是前一根指標的一倍時,就可以使slow指標到一半,而fast指標遍歷完了。使用...

234 回文鍊錶

請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 高階 你能否用 o n 時間複雜度和 o 1 空間複雜度解決此題?正確思路是1.先找到鍊錶的中點 通過快慢雙指標,快指標一次移動兩個單位,慢指標一次移動乙個單位,當快指標頂到頭的時...

234回文鍊錶

題目描述 請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 題解思路 首先反思一下,我這一題的第一想法是將整個鍊錶反轉,然後和原鍊錶同步遍歷,全部相同便是回文鍊錶,但是發現,你在反轉鍊錶的時候,原鍊錶被破壞了,所以第一次失敗。然後...