生活随笔
收集整理的這篇文章主要介紹了
回文链表。
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
請判斷一個鏈表是否為回文鏈表。
示例 1:
輸入: 1->2
輸出: false
示例 2:
輸入: 1->2->2->1
輸出: true
方法一:
1.找到中間節點(快慢指針,快走二,慢走一,最后慢為中間節點位置)
2.中間節點之后的鏈表反轉(前一個節點指針域指向后一個節點)
3.前半部分鏈表和后半部分反轉的鏈表比較
4.后半部分反轉的鏈表回歸原樣(因為通過函數對鏈表操作最好不要修改原鏈表結構)
struct ListNode* reverse_list(struct ListNode* head
)
{struct ListNode* back
=head
;struct ListNode* pre
=NULL;while(back
){struct ListNode* t
=back
->next
;back
->next
=pre
;pre
=back
;back
=t
;}return pre
;
}
struct ListNode* FindMidNode(struct ListNode* head
)
{struct ListNode* fast
=head
;struct ListNode* slow
=head
;while(fast
->next
&&fast
->next
->next
){fast
=fast
->next
->next
;slow
=slow
->next
;}return slow
;
}
bool
isPalindrome(struct ListNode* head
)
{if(!head
)return true
;struct ListNode* Mid
=FindMidNode(head
);struct ListNode* Rev
=reverse_list(Mid
->next
);struct ListNode* p1
=head
;struct ListNode* p2
=Rev
;bool result
=true
;while(p2
){if(p2
->val
!=p1
->val
)result
=false
;p2
=p2
->next
;p1
=p1
->next
;}Mid
->next
=reverse_list(Rev
);return result
;
}
方法二:
將鏈表數據域元素存入一個數組,再對數組進行首位比較;
bool
isPalindrome(struct ListNode* head
)
{int a
[50000];int k
=0,j
,i
;struct ListNode* p
=head
;while(p
){a
[k
]=p
->val
;p
=p
->next
;k
++;}for(i
=0,j
=k
-1;i
<k
,j
>=0;i
++,j
--){if(a
[i
]!=a
[j
])return false
;}return true
;
}
總結
以上是生活随笔為你收集整理的回文链表。的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。