1、题目描述
2、思路
相信大家看过部分的题解,这里说两种:一种是将整个链表进行复制一份然后进行反转,再依次与原链表进行比较,相同则是回文结构。另外一种是快慢指针,当快指针走到结尾,慢指针走到中间,将,后半部分反转与前半部分比较。这里使用第一种的方法:
3、代码
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) {
// 如果为空链表,或者只有一个节点,是回文链表
if(head == null || head.next == null)
return true;
// 如果链表多于两个结点,那么复制这张链表
ListNode tmp_head = head;
ListNode dummy_node = new ListNode(0);
ListNode cur = dummy_node;
while(tmp_head != null){
ListNode node = new ListNode(tmp_head.val);
cur.next = node;
cur = node;
tmp_head = tmp_head.next;
}
// 反转原表
cur = head;
ListNode pre = null, next = cur.next;
while(cur != null){
next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
// 将反转的链表和复制的链表进行逐节点对比,如果完全相同就是回文链表
// 否则,不是回文链表
cur = dummy_node.next;
while(cur != null){
if(cur.val != pre.val)
return false;
cur = cur.next;
pre = pre.next;
}
return true;
}
}