一.问题描述
- 请判断一个链表是否为回文链表。
- 示例 1:
- 输入: 1->2
- 输出: false
- 示例 2:
- 输入: 1->2->2->1
- 输出: true
- 进阶:
- 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
二.示例代码
public static void main(String[] args) {
ListNode listNode1 = new ListNode(1);
ListNode listNode2 = new ListNode(2);
ListNode listNode3 = new ListNode(2);
ListNode listNode4 = new ListNode(1);
listNode1.next = listNode2;
listNode2.next = listNode3;
listNode3.next = listNode4;
System.out.println(listNode1);
Boolean result = palindromeList(listNode1);
System.out.println(result);
System.out.println(listNode1);
}
private static Boolean palindromeList(ListNode head) {
ListNode middleHead = getMiddleHead(head);
// 反转链表
ListNode reverseMiddleList = ReverseList206.reverseList(middleHead);
boolean result = true;
ListNode p1 = head;
ListNode p2 = reverseMiddleList;
while (result && p1 != null && p2 != null) {
if (p1.val != p2.val) {
result= false;
}
p1 = p1.next;
p2 = p2.next;
}
ReverseList206.reverseList(reverseMiddleList);
return result;
}
private static ListNode getMiddleHead(ListNode head) {
ListNode p1 = head;
ListNode p2 = head;
while (p1.next != null && p2.next != null) {
p1 = p1.next;
p2 = p2.next;
if (p2.next != null) {
p2 = p2.next;
}
}
return p1.next;
}