回文链表快慢指针法

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;
        }
    }
};
posted @ 2020-08-11 17:38  yangzixiongh  阅读(361)  评论(0编辑  收藏  举报