题目考察的知识点是:
本题主要考察的是链表知识,是否回文,获取头部。
题目解答方法的文字分析:
可以使用中心扩展法,即遍历整个链表,将链表中的每一个节点看作中点,使用left和right指针分别向左和向右遍历牛群编号,判断其是否满足回文串的要求,并找到最长的回文串。使用该方法时,要考虑到奇数回文串和偶数回文串的情况,两种情况下的回文串取最长的一个。
本题解析所用的编程语言:
java语言。
完整且正确的编程代码:
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
public ListNode maxPalindrome (ListNode head) {
// write code here
left = head;
if (isPalindrome(head)) return null;
StringBuilder sb = new StringBuilder();
ListNode p = head;
while (p != null) {
sb.append(p.val);
p = p.next;
}
String str = sb.toString();
int start = 0, end = 0;
for (int i = 0; i < str.length() - 1; i++) {
int [] res1 = palindrome(str, i, i);
int [] res2 = palindrome(str, i, i + 1);
if (res1[1] - res1[0] > end - start) {
start = res1[0];
end = res1[1];
}
if (res2[1] - res2[0] > end - start) {
start = res2[0];
end = res2[1];
}
}
start ++;
end --;
ListNode startNode = head;
end = end - start;
while (head != null) {
if (start == 0) {
startNode = head;
break;
} else {
head = head.next;
start --;
}
}
while (head != null) {
if (end == 0) {
System.out.println(head.val);
break;
} else {
head = head.next;
end --;
}
}
head.next = null;
return startNode;
}
ListNode left = null;
public boolean isPalindrome(ListNode right) {
if (right == null)
return true;
boolean result = isPalindrome(right.next);
result = result & (left.val == right.val) ;
left = left.next;
return result;
}
public int[] palindrome(String str, int i, int j) {
while (i >= 0 && j < str.length()) {
if (str.charAt(i) == str.charAt(j)) {
--i;
++j;
} else break;
}
return new int[] {i, j};
}
}

京公网安备 11010502036488号