迴文連結串列快慢指標法
阿新 • • 發佈:2020-08-11
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; } } };