题目链接:力扣
方法一:
首先用一个函数对链表进行反转,将链表逆置,同时在isPalindrome函数中,逐一比较原链表和逆置链表中的值,如果有值不相同则返回false,该链表不是回文链表;否则返回true,该链表是回文链表。
leetcode可运行代码:
//反转链表
ListNode reverseList(ListNode L) {
ListNode R, p, s, q;
R = (ListNode)malloc(sizeof(Node));
R->next = NULL;
p = L;
while (p) {
s = (Node*)malloc(sizeof(Node));
s->val = p->val;
s->next = R->next;
R->next = s;
p = p->next;
}
q = R->next;
return q;
}
//回文链表
bool isPalindrome(ListNode L) {
ListNode R;
Node* p, * q;
p = L->next;
R = LinkListInit();
R = reverseList(L);
q = R->next;
while (p != NULL && q != NULL) {
if (p->val != q->val) {
return false;
}
else {
p = p->next;
q = q->next;
}
}
return true;
}
方法二:
先将链表中的值,赋值给数值,再从数组的两端开始比较,从而判断链表是否为回文链表。
bool isPalindrome(ListNode L) {
int arr[500000] = {0}, num = 0,i,j;
while (L != NULL) {
arr[num++] = L->val;
L = L->next;
}
for (i = 0, j = num - 1; i < j; ++i, --j) {
if (arr[i] != arr[j]) {
return false;
}
}
return true;
}