鍊錶回文判斷(C )

2022-01-10 09:09:23 字數 2089 閱讀 3617

題目描述:

對於乙個鍊錶,請設計乙個時間複雜度為o(n),額外空間複雜度為o(1)的演算法,判斷其是否為回文結構。
給定乙個鍊錶的頭指標a,請返回乙個bool值,代表其是否為回文結構。保證鍊錶長度小於等於900。
測試樣例:
1->2->2->1

返回:true

思路:

由於空間複雜度要求為o(1),也就是說臨時占用空間和輸入資料規模無關,因此無法利用陣列或者是棧進行判斷。因此先找到中間位置將後半部分指標翻轉,然後兩端分別比較。注意這種方法會修改原鍊錶,但是空間複雜度要求為o(1)也只能這麼做了。

程式執行流程:

1、利用快慢指標找到中間的位置(起初均指向頭結點,然後pslow一次走一步,pfast一次走兩步。注意不需要區分鍊錶結點個數是奇數還是偶數);

2、將後半部分指標翻轉;

3、最後再進行一次遍歷,乙個從前向後,乙個從後向前。

下圖是演示圖(分為鍊錶結點個數奇數和偶數兩種情況),當pfast或pfast->next到達尾部(為null)時,pslow正好到達中間位置。其中當鍊表結點個數為偶數時,pfast首先變為null;

當鍊表結點個數為奇數時,pfast->next首先變為null。

本程式說明:34

時間限制:3秒 空間限制:32768k 熱度指數:8332

5本題知識點: 鍊錶 棧67

題目描述

8對於乙個鍊錶,請設計乙個時間複雜度為o(n),額外空間複雜度為o(1)的演算法,判斷其是否為回文結構。

9給定乙個鍊錶的頭指標a,請返回乙個bool值,代表其是否為回文結構。保證鍊錶長度小於等於900。

10測試樣例:

111->2->2->1

12返回:true

1314

*/15

16 #include 17

using

namespace

std;

1819

struct

listnode

23};

2425

//鍊錶結點構造

26 listnode* create_list_node(int

val)

2731

//鍊錶結點連線

32void connect_list_node(listnode* pcur, listnode*pnext)

3336

3738

39class

palindromelist

51//

反轉鍊錶後半部分指標

52 listnode* prev = pslow;//

臨時儲存用

53 pslow = pslow->next;

54 prev->next = null;//

最中間的點的next置為null

55while(pslow !=null)

5663

64 listnode* pforward = a;//

指向頭結點

65 listnode* pbackward= prev;//

指向鍊錶最後乙個結點

6667

while(!(pforward == pbackward || pforward->next ==pbackward))

6874

return

true;75

}76};77

78void

test()

79107

108int

main()

109

歡迎交流。

鍊錶回文判斷

判斷一條單向鍊錶是不是 回文 回文,英文palindrome,指順著讀和反過來讀都一樣。判斷回文單向鍊錶跟判斷回文字串很大的區別就是遍歷。字串可以自由向前遍歷,而單向字串不行,因此最簡單直觀的思路就是將鍊錶翻轉,然後再進行比較。但是這種方法就比較笨,因為還需要建立另外乙個單鏈表來儲存原有的單鏈表,然...

判斷回文鍊錶

請判斷乙個鍊錶是否為回文鍊錶。鍊錶為單向無環鏈表 示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 這題是讓判斷鍊錶是否是回文鍊錶,所謂的回文鍊錶就是以鍊錶中間為中心點兩邊對稱。我們常見的有判斷乙個字串是否是回文字串,這個比較簡單,可以使用兩個指標,乙個最左邊...

鍊錶 (判斷回文鍊錶)演算法

coding utf 8 author leadingme mail leadingme qq.com mywebsite leadingme.top 回文鍊錶 演算法要求 判斷乙個鍊錶是否為回文鍊錶 示例1 輸入 1 2 輸出 false 示例2 輸入 1 2 2 1 輸出 true class ...