1、题目描述
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
2、思路
回文链表=找到中间节点+反转中间节点之后的子链表
1、找中间节点
/// 1、找中间节点
ListNode fast = head;
ListNode low = head;
// fast==null(偶数)fast.next==null(奇数)
while (fast != null && (fast.next != null)) {
low = low.next;
fast = fast.next.next;
}
ListNode middleNode = low;
2、反转中间节点之后的子链表
if(middleNode==null||middleNode.next==null){
ListNode l2 = middleNode;
}
ListNode dummyHead=new ListNode(5001);
ListNode prev=null;
// 从刚开始第一个节点开始处理
ListNode cur=middleNode;
while(cur!=null){
// 保存当前操作节点的下一个节点地址
ListNode next=cur.next;
cur.next=prev;
prev=cur;
cur=next;
}
ListNode l2 = prev;
3、判断是否相等
// 同时遍历原先链表和l2
while(l2!=null){
if(head.val!=l2.val){
return false;
}
l2=l2.next;
head=head.next;
}
return true;
package leetcode;
public class Test {
public static void main(String[] args) {
ListNode n1 = new ListNode(1);
ListNode n2 = new ListNode(2);
n1.next =n2;
ListNode n3 = new ListNode(3);
n2.next = n3;
ListNode n4 = new ListNode(3);
n3.next = n4;
ListNode n5 = new ListNode(1);
n4.next = n5;
show(n1);
System.out.println(isPalindrome(n1));
}
public static boolean isPalindrome(ListNode head) {
/// 1、找中间节点
ListNode fast = head;
ListNode low = head;
// fast==null(偶数)fast.next==null(奇数)
while (fast != null && (fast.next != null)) {
low = low.next;
fast = fast.next.next;
}
ListNode middleNode = low;
// 2、反转中间节点后的子链表
//ListNode l2=reverseList(middleNode);
if(middleNode==null||middleNode.next==null){
ListNode l2 = middleNode;
}
ListNode dummyHead=new ListNode(5001);
ListNode prev=null;
// 从刚开始第一个节点开始处理
ListNode cur=middleNode;
while(cur!=null){
// 保存当前操作节点的下一个节点地址
ListNode next=cur.next;
cur.next=prev;
prev=cur;
cur=next;
}
ListNode l2 = prev;
// 同时遍历原先链表和l2
while(l2!=null){
if(head.val!=l2.val){
return false;
}
l2=l2.next;
head=head.next;
}
return true;
}
public static void show(ListNode head) {
if (head == null) {
System.out.println("EMPTY LIST!");
return;
}
ListNode currNode = head;
while (currNode.next != null) {
System.out.print(currNode.val);
System.out.print("->");
currNode = currNode.next;
}
System.out.print(currNode.val);
System.out.println();
}
}