1. 程式人生 > 實用技巧 >迴文連結串列快慢指標法

迴文連結串列快慢指標法

LeetCode中的迴文連結串列

  • 首先使用快慢指標,快指標指向第二個節點,慢指標指向第一個節點。
  • 開始迴圈,快指標一次移動兩個節點,慢指標一次移動一個節點。並且慢指標在移動過程中,將節點的next修改為前一個節點。
  • 當快指標移動到連結串列末尾時,慢指標恰好在連結串列中間。
  • 從中間向兩邊移動,判斷節點的val值是否相同,如果存在不相同的節點返回false,否則返回true。
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool isPalindrome(ListNode* head) {
        if(head == NULL || head->next == NULL){
            return true;
        }
        if(head->next->next == NULL ){
            if(head->val == head->next->val){
                return true;
            } else {
                return false;
            }
        }
        ListNode* fast = head->next;
        ListNode* slow = head;
        ListNode* n = slow->next;
        slow->next = NULL;
        while(fast != NULL && fast->next != NULL){
            fast = fast->next->next;
            ListNode* cur = slow;
            slow = n;
            n = n->next;
            slow->next = cur;
            
        }

        if(fast == NULL){
            ListNode* f = n;
            while(f){
                if(f->val == slow->next->val){

                    f = f->next;
                    slow = slow->next;

                } else{

                    return false;
                }
            }
            return true;
        } else{
            ListNode* f = n;
            while(f){
                if(f->val == slow->val){
                    f = f->next;
                    slow = slow->next;

                } else{
                    cout<<slow->val<<endl;
                    return false;
                }
            }
            return true;
        }
    }
};