题意:
给定一个链表,请判断该链表是否为回文结构。
回文是指该字符串正序逆序完全一致。
数据范围: 链表节点数 0 \le n \le 10^50≤n≤105,链表中每个节点的值满足 |val| \le 10^7∣val∣≤107
示例:
输入:
{1}返回值:
true
题解:
1.通过遍历链表,把链表元素存入数组中,然后遍历数组通过判断首尾是否相等判断是否是回文
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类 the head
* @return bool布尔型
*/
public boolean isPail (ListNode head) {
// write code here
int [] a=new int[100005];
int s=0;
while(head!=null)
{
a[s++]=head.val;
head=head.next;
}
s=s-1;
for(int i=0;i<=s/2;++i)
{
if(a[i]!=a[s-i])
return false;
}
return true;
}
}
2.快慢指针
快指针的速度为慢指针的两倍,当快指针为空时,满指针走到中间,然后将满指针所指向的链表反转,然后遍历比较值是否相等判断是否是回文字符串。
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类 the head
* @return bool布尔型
*/
public ListNode reserve(ListNode h)
{
ListNode pre=null,next=null;
while(h!=null)
{
next=h.next;
h.next=pre;
pre=h;
h=next;
}
return pre;
}
public boolean isPail (ListNode head) {
// write code here
ListNode fast=null,last=null;
fast=head;
last=head;
while(fast!=null&&fast.next!=null)
{
fast=fast.next.next;
last=last.next;
}
if(fast!=null)//链表元素个数为基数个
last=last.next;
last=reserve(last);
while(last!=null)
{
if(head.val!=last.val)
return false;
head=head.next;
last=last.next;
}
return true;
}
}