使用快慢指针解决判段链表回文问题
使用快慢指针能精准定位到表中的几分之几;
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool isPalindrome(struct ListNode* head){
if(head==0)
return true;
struct ListNode* slow_p=head,* p=head;
//找到链表的中间节点。
while(p->next!=NULL&&p->next->next!=NULL){ //走两步与走一步之差为中点;
slow_p=slow_p->next;
p=p->next->next;
}
//当以p->next=NULL 结尾是为奇数
// 当以p->next->next=NULL结尾时为偶数;
//将链表分成两半。其中if语句处理链表长度为奇数的情况。
struct ListNode* head_=slow_p->next; //重定义头;
//奇数时p->next==NULL;
if(p->next==NULL){
head_=malloc(sizeof(struct ListNode));
head_->val=slow_p->val;
head_->next=slow_p->next;
}
slow_p->next=0;
//将第二个链表反转;
p=head_;
while(p->next!=0){
slow_p=head_;
head_=p->next; //将头往后移动;
p->next=p->next->next;//先删除
head_->next=slow_p; //尾插法;
}
//按顺序比较两链表val值。
while(head!=0){
if(head->val!=head_->val) return false;
head=head->next;
head_=head_->next;
}
return true;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。