示例: 链表 1->2->3
返回 -1 (表示不是回文)
链表 1->2->3->3->2->1
返回 0 (表示是回文)
思路:利用快慢指针,找到链表的中间节点的位置,当快指针到达链表尾,慢指针到达了链表的中间节点,此时从慢指针的位置一直到链表结束的剩余节点反转。如果是回文的话,那么从反转后的链表节点与原链表从头开始到中间位置的节点会 一 一 相等,反之则不是回文。
代码:
typedef struct Node
{
int data;
struct Node* next;
}node;
int list_huiwen(node* head)
{
node *fast = head->next;
node *slow = head->next;
while((fast != NULL) && (fast->next != NULL))
{
fast = fast->next->next;
slow = slow->next;
}
node *cur = slow;
node *pre = NULL;
while(cur != NULL)
{
node *temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
node *new = head->next;
while(new && pre)
{
if(new->data == pre->data)
{
new = new->next;
pre = pre->next;
}else
{
return -1;
}
}
return 0;
}