[题目链接](剑指 Offer II 027. 回文链表 - 力扣(LeetCode) (leetcode-cn.com))
思路
- 和第26题思路一样,从中间将链表分成两段,将后半段链表进行翻转,再判断前后半段值是否一样
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseNode(ListNode head) {//返回反转链表 //也会将原来的链表进行翻转
ListNode pre = null;
ListNode node = head;
while(node != null) {
ListNode next = node.next;
node.next = pre;
pre = node;
node = next;
}
return pre;
}
public boolean judgeNode(ListNode node1, ListNode node2){
ListNode head1 = node1;
ListNode head2 = node2;
System.out.println("hea1");
while(head1 != null) {
System.out.println(head1.val);
head1 = head1.next;
}
System.out.println("hea2");
while(head2 != null) {
System.out.println(head2.val);
head2 = head2.next;
}
while(node1 != null && node2 != null) {
if(node1.val == node2.val) {
node1 = node1.next;
node2 = node2.next;
}
else return false;
}
return true;
}
public boolean isPalindrome(ListNode head) {
if(head == null || head.next == null) return true;
ListNode fast = head.next;
ListNode slow = head;
while(fast != null && fast.next != null){
slow = slow.next;
fast = fast.next;
if(fast.next != null) fast = fast.next;
}
ListNode second = slow.next;
slow.next = null;
return judgeNode(head,reverseNode(second));
}
}