/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//逆置函数
struct ListNode* reverseList(struct ListNode* head)
{
if(head == NULL)//判断是否为空;
return NULL;
struct ListNode* newnode = NULL;
struct ListNode* cur = head;
while(cur)
{
struct ListNode* next = cur->next;//迭代过程
//头插法
cur->next = newnode;
newnode = cur;
cur = next;//迭代过程
}
return newnode;
}
//中间节点函数
struct ListNode* middleNode(struct ListNode* head)
{
struct ListNode* fast = head;//注意:这里不能用head->next
struct ListNode* slow = head;
while(fast && fast->next)//注意这里的顺序:fast在前面
{
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
bool isPalindrome(struct ListNode* head){
//方法一:
//开辟一个数组a[],再按照数组的方式来比较;
//方法二:
//找中间节点、后半部分逆置、再比较
struct ListNode* mid = middleNode(head);
struct ListNode* rmid = reverseList(mid);
//现在从头节点和rmid节点开始往后比较
while(head && rmid)
{
if(head->val == rmid->val)
{
head = head->next;
rmid = rmid->next;
}
else
{
return false;
}
}
return true;
//此题元素个数为奇数时有个巧合,建议画图理解,
//奇数个时,理应把mid前一个元素的next置为空,但此时这个next刚好指向逆置后的最后一个元素,那么最后一次比较即为同一个元素,再往后走就是NULL了;
}