zoukankan      html  css  js  c++  java
  • LeetCode#234-回文链表

    package shuangzhizhen;
    /*
    234. 回文链表
    请判断一个链表是否为回文链表。
    
    示例 1:
    
    输入: 1->2
    输出: false
    示例 2:
    
    输入: 1->2->2->1
    输出: true
    进阶:
    你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
              解题思路:
                     首先通过快慢指针找到中心节点
                     然后将链表后半部分反转
                     然后双指针判断各部分val值是否相等
                     不等直接返回false
     */
    public class p234 {
        public static boolean isPalindrome(ListNode head) {
            if(head==null||head.next==null)return true;
            ListNode fast=head,slow=head;
            while (fast!=null&&fast.next!=null){
                fast=fast.next.next;
                slow=slow.next;
            }
            if(fast!=null)slow=slow.next;//说明链表长度为奇数,此时要反转的链表头部slow应该指向next
            ListNode right=reverseList(slow);//反转后半段链表
            ListNode left=head;
            while (right!=null){
                System.out.println(right.val+"     ohohohoho");
                right=right.next;
    
            }
            while (right!=null){
                if(right.val!=left.val){
                    System.out.println(left.val+"---------"+right.val);
                    return false;//若碰到值不对的,直接返回false
                }
                else {
                    System.out.println("111111111111     "+left.val+"---------"+right.val);
                    left=left.next;
                    right=right.next;
                }
            }
            return true;
    
    
        }
        public static ListNode reverseList(ListNode head) {//反转链表
            if(head==null||head.next==null)return head;
            ListNode left=head,right=head.next;
            head.next=null;
            while (right!=null){
                ListNode tmp=right.next;
                right.next=left;
                left=right;
                right=tmp;
            }
            return left;
        }
    
        public static void main(String[] args) {
            ListNode l1=new ListNode(1);
            ListNode l2=new ListNode(2);
            ListNode l3=new ListNode(2);
            ListNode l4=new ListNode(1);
            l1.next=l2;
            l2.next=l3;
            l3.next=l4;
            l4.next=null;
            System.out.println(isPalindrome(l1));
        }
    
    }
    

      运行结果:

    反转链表运行结果:

  • 相关阅读:
    Monkey测试
    第八周作业-说说本周项目工作中的情况
    第七周作业-谈谈各种文档
    第六周作业-UML在详细设计阶段的使用心得&&UML建模与软件开发过程模型
    第五周作业-Markdown的使用心得
    第四周作业-Java Web学习心得
    第三周作业-谈谈对编程规范的认识
    第二周作业-软件工作量的估计
    支付宝-发展史及其优缺点
    三种软件的特点分析
  • 原文地址:https://www.cnblogs.com/jifeng0902/p/13283207.html
Copyright © 2011-2022 走看看