zoukankan      html  css  js  c++  java
  • Leetcode0234. 回文链表

    234. 回文链表

    方法: 快慢指针

    主要思路: 使用快慢指针,从第一个位置开始(不是从dummyHead开始),slow最后指向的是靠后中间位置;(类似于二分)
    然后我们可以在慢指针移动过程中,将前面一半的链表反转;slow之前的所有节点都以反转next。
    我们获得前后两段连接: l1 = prevl2 = next;
    当链表为奇数个结点的时候,l2中节点个数比l1多一个;
    后续我们只需要判断一下,当前fast指针是否为null,判断链表节点个数为奇数还是偶数,是奇数则后移一个位置;
    在对两个链表是否相等进行进行判断;
    时间复杂度:O(n)

    /**
     * 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 || head.next == null)
                return true;
            // 两个都从第一个开始后移;slow指向靠后位置;
            ListNode slow = head, fast = head;
            ListNode prev = head;
            while(fast != null && fast.next != null) {
                // fast后移;
                fast = fast.next.next;
    
                ListNode next = slow.next;
                slow.next = prev;
                prev = slow;
                slow = next;
            }
    
            //slow之前所有的节点都往前指了;
            ListNode l1 = prev;
            ListNode l2 = slow;
            // 如果fast!= null 则是, 奇数个点,slow指向后面;
            // 往后移动一位
            if(fast != null) {
                l2 = l2.next;
            } 
            while(l2 != null) {
                if(l1.val != l2.val)
                    return false;
                l2 = l2.next;
                l1 = l1.next;
            }
            return true;
        }
    }
    
    
  • 相关阅读:
    BF3,MW3,CF,高端?亲民
    关于#ifdef __cplusplus extern
    lua源码阅读顺序
    (ZZ)如何实现游戏主循环(Game Loop)的详细解析
    D3D学习总结基础篇(二)从古墓丽影的画面设置了解基础概念
    比较两个json是否相等
    IPAD点滴 WebIM
    Remoting与Font对象 WebIM
    使用android隐藏api实现亮度调节
    symbian的HTTP引擎中对302、301事件的处理
  • 原文地址:https://www.cnblogs.com/sidewinder/p/13864547.html
Copyright © 2011-2022 走看看