牛客網:連結串列的迴文結構
阿新 • • 發佈:2021-02-14
技術標籤:牛客網
題目描述
連結串列的迴文結構
對於一個連結串列,請設計一個**時間複雜度為O(n),額外空間複雜度為O(1)**的演算法,判斷其是否為迴文結構。
給定一個連結串列的頭指標A,請返回一個bool值,代表其是否為迴文結構。保證連結串列長度小於等於900
輸入:1->2->3->2->1
輸出:true
題解
先用快慢指標得到該連結串列的中間結點和尾結點,然後再將中間結點所指向的位置往後進行逆置,得到的逆置後的連結串列和原連結串列的val一 一做比較,如果都相等,則為迴文結構。
初始情況:
mid 為慢指標,最終會走到中間結點,tail為快指標,最終會走到尾結點①mid 一次走一個,tail一次走兩個,直到 tail == NULL或 tail -> next == NULL為止。
②將mid 所指的位置向後進行逆置,如果tail == NULL,則說明該連結串列的長度為偶數個,在逆置時直接逆置mid所指位置即可,若tail->next == NULL,則說明連結串列的長度為奇數個,則在逆置時需要逆置mid->next位置的連結串列
tmp為逆置後連結串列的指標,head為原連結串列的頭指標
③將head 和 tmp的val做比較,如果相等就向下走,不相等就返回false,直到 tmp == NULL(連結串列為奇數個) 或者 head == tmp時結束(連結串列為偶數個)
題解程式碼
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
// write code here
if(A == NULL || A->next == NULL )
{
return false;
}
//先用快慢指標得到中間結點和最後一個結點
struct ListNode* head = A;
struct ListNode* mid = A;
struct ListNode* tail = A;
//struct ListNode* midMove = NULL;
//獲得頭尾指標
while(tail)
{
mid = mid->next;
if(tail->next == NULL){
//表明連結串列個數為奇數個
//則中間移動指標要向後走一個
//midMove = mid;
mid = mid->next;
break;
}
else if(tail->next->next == NULL)
{ //表明連結串列個數為偶數個
mid = mid->next;
tail = tail->next;
//midMove = mid;
break;
}
else{
tail = tail->next->next;
}
}
//將mid指向的連結串列逆置
struct ListNode* tmp = reverseList(mid);
while(tmp && head->next != tmp)
{
if(tmp->val != head->val)
{
return false;
}
else{
tmp = tmp->next;
head = head->next;
}
}
return true;
}
//逆置連結串列
struct ListNode* reverseList(ListNode* A)
{
if(A == NULL || A->next == NULL)
{
return A;
}
struct ListNode* head,* tail,* tmp;
head = A;
tail = A->next;
head->next = NULL;
while(tail)
{
tmp = tail->next;
tail->next = head;
head = tail;
tail = tmp;
}
return head;
}
};