链表实现回文判断(基于链表反转)

链表实现回文判断

这篇文章是利用链表的反转实现回文的判断。

package com.datastructure.linkedlist;

/**
 * 回文判断
 * @Auther: dlm
 * @Date: 2020/4/6 11:39
 */
public class Plalindrome {

    //头结点
    private Node head = null;

    public static class Node{

        private int data;   //存储数据,整型

        private Node next;  //指向下一个元素

        public Node(int data, Node next){
            this.data = data;
            this.next = next;
        }

        public int getData(){
            return data;
        }
    }

    //判断回文
    public boolean plalindrome(Node p){
        //p为头结点
        if(p == null){  //空链表
            return false;
        }

        if(p.next == null){ //只有一个结点
            return true;
        }

        Node n = p;
        Node m = p;
        //寻找中间结点
        while (n.next != null && n.next.next != null){
            m = m.next;
            n = n.next.next;
        }

        Node right = null;
        Node left = null;
        if(n.next == null){ //奇数,m为中间结点
            right = m.next;
            left = reverse(p,m).next;
        }else { //偶数,m 及 m的下一个结点 为中间结点
            right = m.next;
            left = reverse(p,m);
        }

        return TFResult(right,left);
    }

    //判断左边及右边是否相等
    private boolean TFResult(Node right, Node left) {
        while (right != null && left != null){
            if(right.data != left.data){
                right = right.next;
                left = left.next;
            }else {
                return false;
            }
        }
        return true;
    }

    //链表反转
    public Node reverse(Node p, Node m){ //p为头结点,m为中间结点
        Node pre = null;
        Node curr = p;
        while (curr != m){
            Node next = curr.next;
            curr.next = pre;
            pre = curr;
            curr = next;
        }
        return curr;
    }

}
欢迎关注个人公众号,可直接扫描以下二维码或微信搜索“阿毛聊技术”。

猜你喜欢

转载自www.cnblogs.com/limaodeng/p/12641026.html