题解 | #牛群编号的回文顺序II#
牛群编号的回文顺序II
https://www.nowcoder.com/practice/e887280579bb4d91934378ea359f632e
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) {
int[] values = new int[getSize(head)];
ListNode current = head;
for(int i=0;i<values.length;i++){
values[i] = current.val;
current = current.next;
}
if(isPalindrome(values)){
return null;
}
int start = 0;
int end = 0;
int maxLen = 0;
for(int i=0;i<values.length;i++){
for(int j=0;j<values.length;j++){
if(isPalindrome(values,i,j)&&(j-i)>maxLen){
start = i;
end = j;
maxLen = j-i;
}
}
}
ListNode result = null;
for(int i=start;i<=end;i++){
result = addToEnd(result,values[i]);
}
return result;
// write code here
}
private static boolean isPalindrome(int[] values){
int i=0;
int j=values.length-1;
while(i<j){
if(values[i]!=values[j]){
return false;
}
i++;
j--;
}
return true;
}
private static boolean isPalindrome(int[] values,int start, int end){
while(start<end){
if(values[start]!=values[end]){
return false;
}
start++;
end--;
}
return true;
}
private static int getSize(ListNode head){
int size = 0;
ListNode current = head;
while(current!=null){
size++;
current = current.next;
}
return size;
}
private static ListNode addToEnd(ListNode head,int value){
ListNode newNode = new ListNode(value);
if(head==null){
return newNode;
}
ListNode current = head;
while(current.next!=null){
current = current.next;
}
current.next = newNode;
return head;
}
}
- 将链表的值存储在数组中: 遍历链表,将每个节点的值存储在一个数组中。这样我们就得到了一个可以直接操作的数组,方便后续的处理。
- 检查数组是否是回文的: 使用两个指针(一个从头开始,一个从尾开始)向中间移动,比较对应位置的值是否相等。如果整个数组是回文的,说明原始链表是回文的,直接返回空链表。
- 找到最大连续回文子数组: 如果数组不是回文的,我们需要找到最大的连续回文子数组。可以使用两层循环来遍历所有可能的子数组,然后检查每个子数组是否是回文的。记录最大回文子数组的起始索引和结束索引。
- 根据最大回文子数组构建链表: 使用最大回文子数组的起始索引和结束索引,在原始数组中找到对应的节点值,然后构建一个新的链表。
- 返回结果: 返回新构建链表的头节点。