判斷一條單向鍊錶是不是「回文」 ?回文,英文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....