先用快慢指针确定中间(一个函数),再用反转链表那套反转后半部分(两个函数),最后头尾循环比较(主函数)
判断一个链表是否为回文结构
http://www.nowcoder.com/questionTerminal/3fed228444e740c8be66232ce8b87c2f
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类 the head
* @return bool布尔型
*/
bool isPail(ListNode* head) {
// write code here
if (head == nullptr || head->next == nullptr)
return true;
ListNode *midFirst = midmid(head);
ListNode *rightHead = reverseList(midFirst);
ListNode *newHead = rightHead;
midFirst->next = nullptr;
// 开始比较
ListNode *leftHead = head;
while (leftHead != nullptr)
{
if (leftHead->val != rightHead-> val)
return false;
leftHead = leftHead->next;
rightHead = rightHead->next;
}
reverseList(newHead);
return true;
}
ListNode* midmid(ListNode* head){
ListNode *fast = head;
ListNode *slow = head;
while (fast->next != nullptr && fast->next->next != nullptr)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
ListNode* reverseList(ListNode* head){
ListNode *pre = head;
ListNode *cur = head->next;
while(cur != nullptr)
{
ListNode *temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
return pre;
}
};
查看3道真题和解析