7、迴文鏈表

使用快慢指針,當快指針到達表尾的時候,慢指針在鏈表中部,將鏈表的後半部分進行倒置,與前半部分進行比較,相等則爲迴文鏈表。

鏈表的倒置部分:例如1>2>3>4>3>2>1

相當於是pre(前節點)>slow(當前節點)>next(下個節點)三個指針在鏈表上滑動,開始的時候,slow指向4這個節點,pre 開始指向爲NULL;

1、用新指針p保存每一次slow的下個節點(p = slow -> next);

2、要實現鏈表的反轉,就是要實現pre<slow這個步驟,所以將slow指向pre(slow -> next = pre);

3、一次反轉完成後將指針向右滑動,pre = slow(slow成爲了前節點);

4、slow = p(此時的p成爲了當前節點);

循環以上步驟,直到slow = NULL,pre剛好指向鏈表的最後一個節點,實現了所有鏈表的反轉。

bool isPalindrome(struct ListNode* head){
    struct ListNode* fast = head;
    struct ListNode* slow = head;
    struct ListNode* pre = NULL;
    if(!head || !head->next)
        return true;
    while(fast && fast->next){      //快慢指針移動
           fast = fast->next->next;
           slow = slow->next;     
    } 
    while(slow){                    //鏈表倒置
        struct ListNode *p 
        p = slow->next;
        slow->next = pre;
        pre = slow;
        slow = p;
    }
    while(pre && head){             //比較
        if(pre->val != head->val)
            return false;
        pre = pre->next;
        head = head->next;
    }
    return true;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章