回文链表
题目描述
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
方法1.
执行步骤:
第一步:找到中间的那个节点
第二步:从中间那个链表往后依次进行翻转,
第三步:将翻折之后的与前面一半的链表数据进行比较(只要有一个数据不一样那么就是错误的)
bool isPalindrome(struct ListNode* head){
struct ListNode* fast,*slow;
if (head == NULL || head->next == NULL) {
return true;
}
//找到了中间结点 return slow就是中间结点
fast=slow=head;
while (fast && fast->next) {
slow=slow->next;
fast=fast->next->next;
}
struct ListNode* cur,*newH,*next;
newH=NULL;
cur=slow;
while (cur) {
next=cur->next;
cur->next=newH;
newH=cur;
//更新链表
cur=next;
}
cur=newH;
while(head && cur) {
if (head->val != cur->val) {
return false;
} else {
head=head->next;
cur=cur->next;
}
}
return true;
}
方法2:常规法 将链表转化成数组
第一步:将链表依次放入到新创建的数组中
第二步:依次进行比较放入的元素
bool isPalindrome(struct ListNode* head){
struct ListNode* cur;
int idx=0;
int arr[1000000]={0};
cur=head;
while(cur) {
arr[idx++]=cur->val;
cur=cur->next;
}
int start=0;
int end=idx-1;
while (start < end) {
if(arr[start] != arr[end])
return false;
start++;
end--;
}
return true;
}
运行结果: