标签:ever rom 节点 递归 solution isp 链表 tno lis
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2 输出: false
示例2:
输入: 1->2->2->1 输出: true
思路:切成两半,把后半段反转,然后比较两半是否相等
class Solution { public boolean isPalindrome(ListNode head) { if(head == null || head.next == null) return true; ListNode slow = head; // slow是第二段的头结点 ListNode fast = head.next; while(fast != null && fast.next!= null){ slow = slow.next; fast = fast.next.next; } if(fast != null) slow = slow.next; // 如果链表长度是偶数,slow再往前一个节点 cut(head, slow); return isEqual(head, reverse(slow)); } private void cut(ListNode head, ListNode cutNode){ ListNode cur = head; while(cur.next != cutNode){ cur = cur.next; } cur.next = null; } private ListNode reverse(ListNode head){ // 这种反转链表方法比递归和头插法快 ListNode node = null; while(head != null){ ListNode next = head.next; head.next = node; node =head; head =next; } return node; } private boolean isEqual(ListNode l1, ListNode l2){ while(l1 != null && l2 != null){ // 如果链表长度是奇数个,分开的链表长度不一样,所以这里要用&&,只要任意一个链表遍历完就可以认为两个链表一样 if(l1.val != l2.val) return false; l1 = l1.next; l2 = l2.next; } return true; }
标签:ever rom 节点 递归 solution isp 链表 tno lis
原文地址:https://www.cnblogs.com/tendermelon/p/13358185.html