题目
给定一个链表,请判断该链表是否为回文结构。
将数据存入数组中
我们很简单粗暴的一种办法,就是将数组遍历一次
把里边所有的值都填入到一个数组中
然后从数组中判断是否是回文的
我这里判断是否回文用的是双指针的方法
bool isPail(ListNode* head) {
vector<int> num;
ListNode* p = head;
while (p != NULL) {
num.push_back(p->val);
p = p->next;
}
//成功存入数组中去
int left = 0;
int right = num.size() - 1;
while (left < right) {
if (num[left] != num[right]) {
return false;
}
else {
left++;
right--;
}
}
return true;
}
快慢指针
我们首先使用快慢指针,将慢指针定位到中间点
之后翻转后半部分指针
然后做顺序比较
ListNode* reverse(ListNode* head,ListNode* end) {
//翻转链表
ListNode* cur = NULL;
ListNode* next = head;
while (next != end) {
ListNode* temp = next->next;
next->next = cur;
cur = next;
next = temp;
}
return cur;
}
bool isPail(ListNode* head) {
ListNode* fast = head;
ListNode* slow = head;
while (fast != NULL) {
fast = fast->next->next;//快指针一次走两步
slow = slow->next;//慢指针一次走一步
}
//中间点就是慢指针的的next
ListNode* head2 = reverse(slow,fast);
while (head != NULL && head2 != NULL) {
if (head->val != head2->val) return false;
head = head->next;
head2 = head2->next;
}
return true;
}
其中用到了翻转链表的知识
希望对大家有所帮助