题目描述
请判断一个链表是否为回文链表。
要求:用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题
示例
示例1
输入: 1->2
输出: false
示例2
输入: 1->2->2->1
输出: true
解题思路
使用反转链表,将链表分为前后两个链表,反转其中一个链表,再比较两个链表的值是否相等。
注意:
- 链表为空和链表只有一个节点的情况
- 链表结点为奇数个和偶数个的处理
public static boolean isPalindrome(ListNode head) {
if(head == null || head.next == null) return true;
ListNode cur = head;
ListNode newHead = head;
ListNode pre;
//1.计算链表的结点个数
int count = 0;
while(cur != null){
count++;
cur = cur.next;
}
cur = head;
//2.判断结点个数奇偶,将链表分为前后两个部分
for(int i = 1; i < count/2; i++){
cur = cur.next;
}
if(count%2 == 0){
newHead = cur.next;
cur.next = null;
}else{
newHead = cur.next.next;
cur.next = null;
}
//3. 将后半部分的链表翻转
cur = newHead;
pre = newHead;
while(newHead != null && newHead.next != null){
cur = newHead.next;
newHead.next = newHead.next.next;
cur.next = pre;
pre = cur;
}
newHead = pre;
//4.比较两个链表的值是否相等
while(head != null){
if(head.val != newHead.val)
return false;
else{
head = head.next;
newHead = newHead.next;
}
}
return true;
}
改进: 用快和慢两个指针找后半部分链表的头结点。