1. 程式人生 > 其它 >牛客網:連結串列的迴文結構

牛客網:連結串列的迴文結構

技術標籤:牛客網

題目描述

連結串列的迴文結構

對於一個連結串列,請設計一個**時間複雜度為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; } };