struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class PalindromeList {
public:
struct ListNode* middleNode(struct ListNode* head) {
struct ListNode* slow = head, *fast = head;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode* n1, *n2, *n3;
n1 = NULL;
n2 = head;
n3 = n2->next;
while (n2) {
n2->next = n1;
n1 = n2;
n2 = n3;
if (n3) {
n3 = n3->next;
}
}
return n1;
}
bool chkPalindrome(ListNode* A) {
// write code here
struct ListNode* mid = middleNode(A);
struct ListNode* rmid = reverseList(mid);
while (rmid && A) {
if (rmid->val != A->val) {
return false;
}
A = A->next;
rmid = rmid->next;
}
return true;
}
};
回文结构说白了就是看链表从中间分开是否对称。所以我们要先找中间节点,然后对半劈开,把中间节点后面的逆置与前面的进行比较。这是大致思路。
这个就是之前写过的用快慢指针找中间节点。
这个也是之前写过的逆置链表。
下面该进行比较了
当链表是基数,反转链表之后一个是1->2一个是1->2->3其实这里1->2中2的next指针指向的位置也是3。因为从3后面开始就不在逆置了。所以直接比较就可以。
偶数个的时候就就好理解了,直接比就可以了。