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));
        }
    
    }
    

      运行结果:

    反转链表运行结果:

  • 相关阅读:
    selenium+phantomjs爬取bilibili
    使用 python 开发 Web Service
    OBIEE 立方刷新的问题
    解析OracleOLAP使用MView刷新Cube
    Codeforces Round #755 (Div. 2, based on Technocup 2022 Elimination Round 2)(CF1589)题解
    Codeforces Round #754 (Div. 2)(CF1605)题解
    完美解读Linux中文件系统的目录结构
    C#中获取程序当前路径的集中方法
    30个优秀.net在线学习资源站点
    如何删除windows service(转帖)
  • 原文地址:https://www.cnblogs.com/jifeng0902/p/13283207.html
Copyright © 2011-2022 走看看