递归玩熟了以后,看到啥都想来递归,简直是拿着锤子看啥都像钉子
但是这道题递归效率比较低,因为会扫到重复的部分
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
示例 1: 输入:head = [1,2,2,1] 输出:true 示例 2: 输入:head = [1,2] 输出:false 提示: 链表中节点数目在范围[1, 105] 内 0 <= Node.val <= 9
进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnv1oc/
来源:力扣(LeetCode)
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { ListNode p; public boolean isPalindrome(ListNode head) { p=head; if(null==back(head)) return false; else return true; } ListNode back(ListNode a){ if(a==null|a.next==null) return a; ListNode b= back(a.next); if(b!=null&&b.val==p.val){//判断 p=p.next; return a; } else return null; } }
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnv1oc/?discussion=HUFvuK
public boolean isPalindrome(ListNode head) { ListNode fast = head, slow = head; //通过快慢指针找到中点 while (fast != null && fast.next != null) { fast = fast.next.next; slow = slow.next; } //如果fast不为空,说明链表的长度是奇数个 if (fast != null) { slow = slow.next; } //反转后半部分链表 slow = reverse(slow); fast = head; while (slow != null) { //然后比较,判断节点值是否相等 if (fast.val != slow.val) return false; fast = fast.next; slow = slow.next; } return true; } //反转链表 public ListNode reverse(ListNode head) { ListNode prev = null; while (head != null) { ListNode next = head.next; head.next = prev; prev = head; head = next; } return prev; }