現給定乙個鍊錶listnode* phead,定義bool代表鍊錶是否為回文,請編寫程式。
返回:true
返回:false
本題的思路分為三步走:
找尋中間位置->將鍊錶分為兩部分,對後一部分進行翻轉->進行指標指向資料的比較。
1、找尋中間位置
找尋中間位置,還是運用快慢指標的思想,(具體細節參考我的之前有一篇部落格快慢指標的兩道題目,裡面有詳細的講解)。在對於單鏈表的操作之中,快慢指標的思想能夠幫助我們解決絕大多數部分的問題。
2、將鍊錶分為兩部分,對後一部分進行翻轉
舉個例子:1->2->3->2->1
進行第一步之後,我們得到中間元素對應的val值為3,此時我們定義乙個結構體指標變數slow指向此處,此時在定義乙個結構體變數為prev,指向slow指向元素的前乙個元素,即val值為2的位址。此時找到之後,將prev->next = null。
即1->2與3->2->1這兩個鍊錶。
得到這兩個鍊錶之後,對3->2->1進行翻轉。
翻轉的思想還是要根據以下的**去自己手動畫圖實現一下,加深對這個過程的理解。
翻轉完成後,一定要將slow置為reversehead指向的位址。
3、進行指標指向的val的比較
**特別注意:**迴圈體進行的條件一定要為原鍊錶phead指向的元素完後走不為空的情況下進行。
例如,得到1->2與3->2->1這兩個鍊錶,phead指向的位址是1->2中val=1對應的結構體位址,slow指向的位址是3->2->1中val=3對應的結構體位址。此時如果用slow是否為空去判斷會造成棧溢位的報錯,因此要使用phead是否為空去判定。
/*
struct listnode
};*/
class palindrome
listnode* fast = phead;
listnode* slow = phead;
listnode* prev = phead;
listnode* reversehead =
null
;//1、運用快慢指標找到鍊錶的中間元素
//若鍊錶元素個數為奇數,則找尋中間元素
//若鍊錶元素個數為偶數,找出中間元素靠後的那乙個元素
while
(fast && fast->next)
//slow指向鍊錶中間元素後,將其前一位鍊錶元素對應的next置為空,變成兩個鍊錶
prev->next =
null
;//2、從找到的中間位置對其之後的鍊錶元素進行翻轉。
while
(slow)
//將翻轉之前的slow之前一位的個數置為翻轉之後slow指向的位置
slow = reversehead;
//3、比較
while
(phead)
else
}return true;
}
牛客網 程式設計題 鍊錶分割
現有一鍊錶的頭指標 listnode phead,給一定值x,編寫一段 將所有小於x的結點排在其餘結點之前,且不能改變原來的資料順序,返回重新排列後的鍊錶的頭指標。解這道題目,最重要的是建立兩個鍊錶,將小於x的結構體放到乙個鍊錶lesshead,大於x的結構體放到另乙個鍊錶greaterhead。最...
牛客網程式設計題
參考了排行榜大神 1.計算字串最後乙個單詞的長度,單詞以空格隔開 a raw input b a.split print len b 1 2.寫出乙個程式,接受乙個有字母和數字以及空格組成的字串,和乙個字元,然後輸出輸入字串中含有該字元的個數。不區分大小寫 a raw input lower b r...
牛客網 鍊錶的回文結構
對於乙個鍊錶,請設計乙個時間複雜度為o n 額外空間複雜度為o 1 的演算法,判斷其是否為回文結構。給定乙個鍊錶的頭指標a,請返回乙個bool值,代表其是否為回文結構。保證鍊錶長度小於等於900。測試樣例 先使用快慢指標法,設定兩個指標fast和slow,遍歷鍊錶,fast指標速度是slow指標的兩...