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;
}

 

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