我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/palindrome-linked-list/description/
题目描述:
知识点:链表
思路:快慢双指针遍历链表,再将后半部分链表翻转
关于反转链表函数的实现,请见LeetCode206——反转链表。
时间复杂度是O(n),其中n为链表中的节点数。空间复杂度是O(1)。
JAVA代码:
public class Solution {
public boolean isPalindrome(ListNode head) {
if(head == null || head.next == null) {
return true;
}
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode cur2 = dummyHead;
ListNode cur3 = dummyHead;
while(cur3 != null && cur3.next != null) {
cur2 = cur2.next;
cur3 = cur3.next.next;
}
cur2 = cur2.next;
ListNode preCur2 = dummyHead;
while(preCur2.next != cur2) {
preCur2 = preCur2.next;
}
preCur2.next = null;
ListNode newHead = reverseLinkedList(cur2);
ListNode cur = head;
ListNode newCur = newHead;
while(cur != null && newCur != null) {
if(cur.val != newCur.val) {
return false;
}
cur = cur.next;
newCur = newCur.next;
}
return true;
}
private ListNode reverseLinkedList(ListNode head) {
if(head == null || head.next == null) {
return head;
}
ListNode pre = null;
ListNode cur = head;
ListNode next = cur.next;
while(cur != null) {
cur.next = pre;
pre = cur;
cur = next;
if(cur != null) {
next = cur.next;
}
}
return pre;
}
}
LeetCode解题报告: