二、问题分析
首先我们要了解回文结构是什么,最典型的一个例子是:上海自来水来自海上。
故而解决这个题目有三步:1、尝试找到链表的中间结点。2、反转其中的一半链表;得到两条链表。3、依次比较两个链表中的每个结点,如果全部相等则返回true,存在不一样就返回false。
牛客题中有一个注意点,就是它链表的构造方法没有给定无参构造,所以我们在开辟新链表结点时要用有参构造 。即得赋值ListNode fakeHeadHead=new ListNode(-1);而不能ListNode fakeHead=new ListNode();
关于链表逆置的详细讲法指路☞
三、完整代码
import java.util.*; /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class PalindromeList { //遍历求结点个数 private int sizeOf(ListNode head){ int count=0; for (ListNode cur=head; cur!=null ;cur=cur.next ) { count++; } return count; } //求中间结点位置 private ListNode middleNode(ListNode head){ int size=sizeOf(head); for(int i=0;i<size/2;i++){ head= head.next; } return head; } //逆置后面一半的链表得到新的链表 private ListNode reverse(ListNode head){ ListNode fakeHead=new ListNode(-1); fakeHead.next=head; ListNode pre=null; ListNode cur=head; while(cur!=null){ ListNode curLast=cur.next; cur.next=pre; pre=cur; cur=curLast; } return pre; } public boolean chkPalindrome(ListNode A) { // write code here ListNode B1=A; // 找到链表的中间结点 ListNode midNode=middleNode(A); // 以中间结点为头结点进行逆置 ListNode B2=reverse(midNode); // 全部相等:回文 true // 存在不相等:不是回文 false while(B1!=null&&B2!=null){ if(B1.val!=B2.val){ // 存在不相等 return false; } B1=B1.next; B2=B2.next; } // 全部相等 return true; } }