题目描述:
解题思路:
1、可以把链表中的值存起来,然后判断是不是符合回文。
2、这道题最好的做法是利用双指针,快慢指针,slow next, fast next.next,然后当fast指针到终点的时候,slow就是中间,然后将slow后面的链表反转,再将fast指向head,开始比较即可。注意要对链表的反转熟练。
3、另一种方法是利用栈先进先出的特点,实现判断。
参考代码:
方法1
public boolean isPalindrome(ListNode head) {
List<Integer> list=new ArrayList<>();
while (head!=null)
{
list.add(head.val);
head=head.next;
}
int l=0;
int r=list.size()-1;
while (l<r){
if(list.get(l).intValue()!=list.get(r).intValue())
{
return false;
}
l++;
r--;
}
System.out.println();
return true;
}
方法2
public boolean isPalindrome(ListNode head) {
ListNode fast = head, slow = head;
//寻找中点
while (fast!=null&&fast.next!=null){
fast=fast.next.next;
slow=slow.next;
}
//如果fast不为空,说明链表长度是奇数
if(fast!=null){
slow=slow.next;
}
//反转链表
slow=reverse(slow);
//将fast指针移到head
fast=head;
//比较
while (slow!=null){
if(fast.val!=slow.val)
{
return false;
}
fast=fast.next;
slow=slow.next;
}
return true;
}
//反转链表
private ListNode reverse(ListNode head) {
ListNode pre = null;
while (head != null) {
ListNode next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
方法3
public boolean isPalindrome2(ListNode head) {
ListNode temp=head;
Stack<Integer> stack=new Stack<>();
while (temp!=null){
stack.push(temp.val);
temp=temp.next;
}
while (head!=null){
if(head.val!=stack.pop()){
return false;
}
head=head.next;
}
return true;
}