回文链表

问题陈述

请判断一个链表是否为回文链表。

示例:

1
2
输入: 1->2->2->1
输出: true

将链表存入数组然后双指针判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public boolean isPalindrome(ListNode head) {
ListNode node1=head;
int len=0;
while(node1!=null){//获取链表长度
len++;
node1=node1.next;
}

int[] array=new int[len];
int k=0;
for(ListNode node=head;node!=null;node=node.next){//将链表元素存入数组
array[k++]=node.val;
}
for(int i=0,j=len-1;i<j;i++,j--){
if(array[i]!=array[j]) return false;//每一对都相等才是回文
}
return true;

}
}

链表上反转一半元素进行比较

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution{
public boolean isPalindrome(ListNode head) {
if(head == null || head.next == null) {
return true;
}
ListNode slow = head, fast = head;
ListNode pre = head, prepre = null;
while(fast != null && fast.next != null) {
pre = slow;
slow = slow.next;
fast = fast.next.next;
pre.next = prepre;
prepre = pre;
}
if(fast != null) {
slow = slow.next;//slow指向下半部分头结点
}
while(pre != null && slow != null) {
if(pre.val != slow.val) {
return false;
}
pre = pre.next;
slow = slow.next;
}
return true;
}

}