牛客網 程式設計題 回文鍊錶

2021-10-19 14:41:16 字數 1668 閱讀 6083

現給定乙個鍊錶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指標的兩...