檢查鏈表是否爲迴文

題目:編寫一個函數,檢查鏈表是否爲迴文。

解法一:根據迴文的定義,正向反向讀取時一致,即爲迴文,因此可以將原鏈表反轉再與原鏈表比較,完全一樣就是迴文。算法比較簡單就不貼代碼了。

解法二:如果鏈表是迴文,那麼前半部分和後半部分一樣,但是順序相反。單鏈表沒有前向指針,所以依靠指針只能在一個方向上比較。如果將鏈表的前半部分反序,就可以和後半部分比較了,反序可以用到數據結構棧。

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;
}


發佈了147 篇原創文章 · 獲贊 18 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章