回文链表
请判断一个链表是否为回文链表。
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
解题思路(参考题解)
空链表和单结点链表都属于回文链表
数组
使用数组存放链表元素,从数组开始和末尾进行判断
public boolean isPalindrome(ListNode head)
{
if(head==null||head.next==null)
retturn true;
ArrayList<Integer> array=new ArrayList<Integer>();
while(head!=null) {
array.add(head.val);
head=head.next;
}
for(int i=0;i<array.size()/2;i++) {
if(!array.get(i).equals(array.get(array.size()-i-1)))
return false;
}
return true;
}
反转链表
寻找中间结点(偶数个结点取右中位数位置结点)
对中间结点进行反转,得到反转后的结点,链表有偶数个元素就中间元素右边的,奇数个就中间的
遍历比较
//反转链表
private ListNode reverse(ListNode head) {
ListNode pre=null,cur;
cur=head;
while(cur!=null) {
ListNode tmp=cur.next;
cur.next=pre;
pre=cur;
cur=tmp;
}
return pre;
}
//寻找链表中间结点,双指针(快慢)
private ListNode generateMid(ListNode head) {
ListNode slow=head;
ListNode fast=head;
while(fast!=null&&fast.next!=null) {
slow=slow.next;
fast=fast.next.next;
}
return slow;
}
public boolean isPalindrome(ListNode head) {
if(head==null||head.next==null) {
return true;
}
ListNode mid=generateMid(head);
ListNode subHead=reverse(mid);
//遍历
while(subHead!=null) {
if(subHead.val!=head.val) {
return false;
}
subHead=subHead.next;
head=head.next;
}
return true;
}
感觉得补一补java的基础知识