• [面试经典编程题]3 单链表判断是否回文


    单链表判断是否回文

    题目描述

    image-20200713221555989

    思路

    三个指针,分别n1,n2,n3;三个指针不断往后移动。

    1、总体思路

    找到中间节点,然后把后半个链表反转后与前半部分比较。

    image-20200713215428482

    (注意:奇数个链表的话是从中点的后一个节点逆置;偶数个链表的话从中间链表的节点逆置)

    2、问题是如何找到中间节点

    使用快慢指针,两指针一开始都指向head,那么fast一次2步,slow一次1步,那么fast走到最后的节点,slow刚好指向中间。

    image-20200713215626116

    Java代码

    方法1:

    借助快慢指针找到中间的节点,翻转后比较前后两半段

    import java.util.*;
    
    /*
    public class ListNode {
        int val;
        ListNode next = null;
    
        ListNode(int val) {
            this.val = val;
        }
    }*/
    public class PalindromeList {
        public boolean chkPalindrome(ListNode A) {
            // 1 使用快慢指针找到链表的中间节点
            ListNode slow = A;
            ListNode fast = A;
            while(fast!=null && fast.next!=null){
                slow = slow.next;
                fast = fast.next.next;
            }
            
            //2 对后半段链表进行逆置操作
            ListNode reversed = reverse(slow);
            //3 比较判断回文
            while(reversed!=null && A!=null){
                if(reversed.val != A.val){
                    return false;
                }else{
                    reversed = reversed.next;
                    A = A.next;
                }
            }
            //跳出while循环,表示比较完毕,返回是回文
            return true;
        }
        
        //链表翻转
        public ListNode reverse(ListNode A) {
            ListNode n0=null;
            ListNode n1=A;
            ListNode n2=A.next;
            while(n1!=null){
                //指向翻转
                n1.next = n0;
                //指针赋值
                n0 = n1;
                n1 = n2;
                if(n2!=null){
                    n2 = n2.next; //n2后移;存在最后一次n2已经为空的后移
                }
                
            }
            //返回n0
            return n0;
        }
    }
    

    输出:

    image-20200713221529534

  • 相关阅读:
    DevOps工具链
    内网穿透工具
    SVN无法检出项目
    IDEA安装插件
    实习过程中学到关于各版本操作系统的知识(2)
    实习过程中学到关于各版本操作系统的知识(1)
    lib1funcs.S(用于解决裸板实现 printf 中的问题: undefined reference to `__aeabi_uidivmod' 和 undefined reference to `__aeabi_uidiv')
    交叉编译工具参数笔记
    vim 源码安装
    Git clone 下载慢解决方案
  • 原文地址:https://www.cnblogs.com/jiyongjia/p/13296280.html
Copyright © 2020-2023  润新知