请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-linked-list
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public boolean isPalindrome(ListNode head) { if(head == null){ return true; } //遍历链表,找到中间节点 ListNode slow = head; ListNode fast = head; while(fast.next != null && fast.next.next != null){ slow = slow.next; fast = fast.next.next; } System.out.println("find slow is " + slow.val); //得到链表逆转后的结果 ListNode reverseResult = reverseList(slow.next); while(reverseResult != null){ if(head.val != reverseResult.val){ return false; } head = head.next; reverseResult = reverseResult.next; } return true; } //单链表的反转 public static ListNode reverseList(ListNode node) { ListNode pre = null; ListNode next = null; while (node != null) { next = node.next; //知道下一个节点是什么 node.next = pre; // 把当前循环到的节点的下一个设置为之前已经遍历的结果内容 pre = node; // 把当前节点再指向pre node = next; //依次向后走 } return pre; } }
时间复杂度:O(n)
空间复杂度:O(1),有多个临时node,但是没有额外的数据结构