码迷,mamicode.com
首页 > 其他好文 > 详细

刷题记录 leetcode234:回文链表

时间:2020-07-22 01:51:54      阅读:84      评论:0      收藏:0      [点我收藏+]

标签: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;
 }

 

刷题记录 leetcode234:回文链表

标签:ever   rom   节点   递归   solution   isp   链表   tno   lis   

原文地址:https://www.cnblogs.com/tendermelon/p/13358185.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!