題目:編寫一個函數,檢查鏈表是否爲迴文。
解法一:根據迴文的定義,正向反向讀取時一致,即爲迴文,因此可以將原鏈表反轉再與原鏈表比較,完全一樣就是迴文。算法比較簡單就不貼代碼了。
解法二:如果鏈表是迴文,那麼前半部分和後半部分一樣,但是順序相反。單鏈表沒有前向指針,所以依靠指針只能在一個方向上比較。如果將鏈表的前半部分反序,就可以和後半部分比較了,反序可以用到數據結構棧。
bool IsPalindromicList(ListNode* pHead)
{
ListNode *fastPointer, *slowPointer;
fastPointer = slowPointer = pHead;
stack<ListNode*> s;
while(fastPointer != NULL && fastPointer->m_pNext != NULL)
{
s.push(slowPointer);
slowPointer = slowPointer->m_pNext;
fastPointer = fastPointer->m_pNext->m_pNext;
}
//奇數個結點,跳過中間結點
if(fastPointer != NULL)
slowPointer = slowPointer->m_pNext;
while(slowPointer != NULL)
{
if(slowPointer->m_nValue != s.top()->m_nValue)
return false;
slowPointer = slowPointer->m_pNext;
s.pop();
}
return true;
}