所屬專欄:玩轉(zhuǎn)數(shù)據(jù)結(jié)構(gòu)題型
博主首頁:初陽785
代碼托管:chuyang785
感謝大家的支持,您的點(diǎn)贊和關(guān)注是對我最大的支持!??!
博主也會更加的努力,創(chuàng)作出更優(yōu)質(zhì)的博文?。?br>關(guān)注我,關(guān)注我,關(guān)注我,重要的事情說三遍?。。。。。。?!
1.題目來源
回文鏈表
2.題目描述
給定一個(gè)鏈表的 頭節(jié)點(diǎn) head ,請判斷其是否為回文鏈表。
如果一個(gè)鏈表是回文,那么鏈表節(jié)點(diǎn)序列從前往后看和從后往前看是相同的。
3.解題思路
這個(gè)題目需要結(jié)合之前的幾個(gè)解題思路。
1.快慢指針
2.查找中間節(jié)點(diǎn)
3.反轉(zhuǎn)鏈表
既然我們要判斷是否是回文數(shù),如果他是個(gè)數(shù)組的話我們就會創(chuàng)建兩個(gè)變量,一個(gè)從頭出發(fā),一個(gè)從尾出發(fā),一次迭代判斷是否相同,這樣的話就很好的解決了問題。
但是這里是鏈表,鏈表的特點(diǎn)就是它是單向的,你只能找到后一個(gè),但是你找不到前面一個(gè)。
那我們就想一下有沒有方法可以實(shí)現(xiàn)類似于數(shù)組的方法呢?
我們先觀察一下回文的特點(diǎn):
我們會發(fā)現(xiàn)如果是偶數(shù)的話左邊一半會等于右邊一半反轉(zhuǎn)之后的樣子。
既然我們不能從尾向頭遍歷,那我們不妨把后半部分反戰(zhàn)過來,讓它的尾做頭,這樣子我們就可以遍歷并判斷力。文章來源:http://www.zghlxwxcb.cn/news/detail-434983.html
于是我們就得先找到中間節(jié)點(diǎn),并從中間節(jié)點(diǎn)開始反轉(zhuǎn)一中間節(jié)點(diǎn)尾起點(diǎn)的鏈表。
反轉(zhuǎn)的時(shí)候我們得創(chuàng)建一個(gè)新的節(jié)點(diǎn)newNode,然后頭插反轉(zhuǎn)鏈表:
但是我們不要忘記了雖然我們反轉(zhuǎn)鏈表了,但是上面的3的next還是指向下面3的地址的:
將他變成這個(gè)樣子之后,我們就可以遍歷我們的head->val是否等于newNode->val來判斷是否是回文鏈表了。
只要head或者newNode其中一個(gè)遍歷到了NULL就停止。文章來源地址http://www.zghlxwxcb.cn/news/detail-434983.html
4.代碼展示
bool isPalindrome(struct ListNode* head)
{
//1.找中間節(jié)點(diǎn)
//快慢指針
struct ListNode*fast=head,*low=head;
while(fast && fast->next)//快慢指針退出條件(當(dāng)鏈表是偶數(shù)后者是奇數(shù)的時(shí)候)
{
low=low->next;
fast=fast->next->next;
}
struct ListNode* midNode=low;
//2.反轉(zhuǎn)中間節(jié)點(diǎn)以后的鏈表
struct ListNode* newNode=NULL,*midNext=NULL;
while(midNode)
{
midNext=midNode->next;
midNode->next=newNode;
newNode=midNode;
midNode=midNext;
}
//3.迭代判斷是否相同
while(head && newNode)//這里同樣的鏈表可能是偶數(shù)也可能是奇數(shù),不知道誰先到達(dá)NULL
{
if(head->val != newNode->val)
return false;
head=head->next;
newNode=newNode->next;
}
return true;
}
到了這里,關(guān)于【LeetCode】數(shù)據(jù)結(jié)構(gòu)題解(6)[回文鏈表]的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!