回文链表
回文链表
方法一: 找到中间结点,将后半段链表反转再比较即可;
方法二: 用栈记录;
仅提供方法一的代码
class Solution {
public boolean isPalindrome(ListNode head) {
if (head.next == null || head == null) {
return true;
}
// 获取链表的长度
int length = 0;
ListNode listNode = head;
while (listNode != null) {
length++;
listNode = listNode.next;
}
// 找到中间结点
int s = length / 2;
listNode = head;
while (s-- > 0) {
listNode = listNode.next;
}
// 如果是奇数再移动一位
if (length % 2 == 1) {
listNode = listNode.next;
}
ListNode reverseList = reverseList(listNode);
s = length / 2;
listNode = head;
while (s-- > 0) {
if (listNode.val != reverseList.val)
return false;
listNode = listNode.next;
reverseList = reverseList.next;
}
return true;
}
// 反转链表
public ListNode reverseList(ListNode head) {
if (head == null) { // 如果只有一个结点或者没有
return head;
}
if (head.next == null) {
return head;
}
ListNode first = head;
ListNode second = head.next;
ListNode third = head.next.next;
if (third == null) { // 如果只有两个
second.next = first;
first.next = null;
return second;
}
first.next = null;
while (second != null) {
second.next = first;
first = second;
second = third;
if (third != null)
third = third.next;
}
return first;
}
}