题目:
判断一个链表是否是回文链表
思路:
1将链表中的元素存入数组进行比较
2快慢指针,快指针一次两步,慢指针一次一步,pre指针用于切分链表,写一个函数用来翻转链表,翻转后两个链表进行对比,如果链表是奇数个,切分后的链表多一个。
class Solution{
public:
bool isPalindrome(List* head){
if(head== nullptr || head->next == nullptr) return true;
ListNode* slow = head;
ListNode* fast = head;
ListNode* pre = head;
while(fast && fast->next){
pre = slow;
slow = slow->next;
fast = fast->next->next;
}
pre->next = nullptr;
ListNode* cur1 = head;
ListNode* cur2 = reverseList(slow);
while(cur1){
if(cur1->val != cur2->val)return false;
cur1 = cur1->next;
cur2 = cur2->next;
}
return true;
}
ListNode* reverseList(ListNode* head){
ListNode* temp;
ListNode* cur = head;
ListNode* pre = nullptr;
while(cur){
temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp
}
}
};
引申出来链表翻转的方法:
迭代法:
用三个指针,依次让链表的指向倒转,首先排除特殊情况,头结点为空和只有一个元素的链表
其次一次定义pre, mid,end,
使用迭代法,让pre,mid,end依次后移直到end为空时停止,返回mid所在的位置作为头结点
ListNode* reverseList(ListNode* head){
if(head->next == NULL && head ==NULL){return head;}
else{
ListNode* pre = nullptr;
ListNode* mid = head;
ListNode* end = head->next;
while(1){
mid->next = pre;
if(end == NULL){ break;}
pre = mid;
mid = end;
end = end->next;
}
head = mid;
return head;
}
}
};