思路:
- 找链表中点(#1偶数个,#2奇数个)
- 把链表后半段压入stack中
- 链表前半段和后半段挨个比较,不对应返回false,否则返回true
代码(注释清晰):
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类 the head
* @return bool布尔型
*/
bool isPail(ListNode* head) {
// 首先,先对特殊情况直接判定
if(head == nullptr || head->next == nullptr)
return true;
// 初始化,快慢指针
ListNode* slow = head;
ListNode* fast = head;
// 初始化stack(stack目的:将后半段反向输出)
stack<int> stk1;
// 链表,1偶数个,2奇数个,&&表示了两种情况的某一终结
while(fast != nullptr && fast->next != nullptr) {
slow = slow->next;
fast = fast->next->next;
}
// 确定后半段的起点指针flag
ListNode* flag = fast==nullptr ? slow:slow->next;
// stack压入后半段所有元素
while(flag) {
stk1.push(flag->val);
flag = flag->next;
}
// stack弹出,并与前半段挨个比较
while(head != slow) {
if(head->val != stk1.top())
return false;
stk1.pop();
head = head->next;
}
// 比较完成,全部对应
return true;
}
};