题解 | #判断一个链表是否为回文结构#
判断一个链表是否为回文结构
http://www.nowcoder.com/questionTerminal/3fed228444e740c8be66232ce8b87c2f
思路:
- 找链表中点(#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; } };