鍊錶回文判斷

2021-07-02 05:33:30 字數 1520 閱讀 6475

判斷一條單向鍊錶是不是「回文」 ?回文,英文palindrome,指順著讀和反過來讀都一樣。

判斷回文單向鍊錶跟判斷回文字串很大的區別就是遍歷。字串可以自由向前遍歷,而單向字串不行,因此最簡單直觀的思路就是將鍊錶翻轉,然後再進行比較。但是這種方法就比較笨,因為還需要建立另外乙個單鏈表來儲存原有的單鏈表,然後翻轉單鏈表,然後再進行比較。所以不推薦使用這種方法。

既然回文單鏈表有如此特性,那麼我們可以考慮部分翻轉單鏈表,然後再利用快慢指標去進行比較,這樣沒有額外的空間開銷,時間複雜度也降低了很多。此時需要注意的問題就是翻轉哪一部分的鍊錶?

因此我們首先需要判斷的就是該鍊錶的長度是奇數還是偶數。如鍊表1所示:

a -> b -> c -> d
此時若要判斷鍊錶是否為回文鍊錶,我們需要從c處開始翻轉,翻轉的位置為(length/2 + 1),即將c與d的位置翻轉,然後通過快慢指標p和q,p指向起始位置,q指向(length/2 + 1),然後依次比較對應資料是否相同,若全部相同,則是回文指標,否則不是。

當鍊表2為奇數時,

a -> b -> c -> d -> e
此時需要翻轉的位置則是翻轉的位置為(length/2 + 2),即將d與e的位置翻轉,然後通過快慢指標p和q,p指向起始位置,q指向(length/2 + 2),然後依次比較對應資料是否相同,若全部相同,則是回文指標,否則不是。

具體**如下:

#includeusing namespace std;

typedef char elemtype;

typedef struct list;

typedef list *linklist;

bool initlink(linklist *list)

bool insertlist(linklist *list, elemtype elem)

p->next = s;

return true;

}int lengthlist(linklist *list)

return count;

}void reverselist(linklist *list)

subhead = p;

first = p->next; //the first reverse node

p = p->next;

q = p->next;

while(q != null)

first->next = null;

subhead->next = p;

}bool ispalindrom(linklist *list)

p = p->next;

cout << "p->data: " << p->data << endl;

while(p->next != null)

return true;

}void printlist(linklist list)

cout << endl;

}int main()

判斷回文鍊錶

請判斷乙個鍊錶是否為回文鍊錶。鍊錶為單向無環鏈表 示例 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 ...

判斷鍊錶是否回文?

given a singly linked list,determine if it is a palindrome.思路 兩個指標,乙個正常遞推,另乙個遞推速度為第乙個的兩倍 node.next.next 到末,分兩種情況 1.奇數個元素,最後快指標指向最後乙個元素 p2.next null 2....