题目要求:
解释
因为牛客的反转链表中的节点类中,构造函数只有val
的构造函数,并没有两个参数的构造函数。使用递归反转的链表因为链表的内存地址并没发生改变,会有一个测试点过不了。想使用新建链表的方式进行反转,发现他的节点类ListNode
竟然只有一个val的带参构造器。因此不能直接使用。
代码:
public boolean isPail (ListNode head) {
ArrayList<Integer> arr = new ArrayList(); // 建一个数组
while(head != null){ // 将链表元素加到数组中
arr.add(head.val);
head = head.next;
}
// 两个指针
int left = 0;
int right = arr.size() -1;
while(left<right){ // 当两指针相遇途中有不相等的节点即为非回文
if(arr.get(left) != arr.get(right) return false;
left++;
right--;
}
return true;
}
思路:
- 使用数组,将链表遍历一次并添加到数组中
- 声明两个指针,分别指向数组的最左边和最右边
- 当左指针小于右指针,让两个元素一直比较。若在两指针相遇时全部元素都相等,那就是回文链表
- 在两指针相遇中途有一个不相等的元素值,即不是回文链表。