判断链表是否为回文结构

什么是回文结构,很好理解,例如这里有一句话“上海自来水来自海上”,从前读或者从后读,它都是一样的,这就是回文结构

题目网址:https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?
例如有这么一个链表

1->2->2->1
那么它就是回文结构,返回true

这道题的大致思路如下:找到该链表的中间结点,将该中间结点的后半部分进行逆置,然后比较前半部分和后半部分的链表是否相同,如果相同则返回true

在这里插入图片描述

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) {
        // write code here
        if(A == null || A.next == null){
        	//只有一个结点或链表为空的情况下
            return true;
        }
        int len = size(A);
        int steps = len / 2;
        ListNode B = A;
        for(int i =0;i < steps; i++){
            B = B.next;
            //B为中间结点
        }
        ListNode cur = B;
        ListNode prev = null;
        while(cur != null){
        	//将B进行逆置
            ListNode next = cur.next;
            if(next == null){
                B = cur;
            }
            cur.next = prev;
            prev = cur;
            cur = next;
        }
        while(B != null){
        	//遍历B,并且比较A,这里由于奇偶关系,我们遍历B
            if(A.val != B.val){
                return false;
            }
            A = A.next;
            B = B.next;
        }
        return true;
    }
    public int size(ListNode cur){
        int size = 0;
        for(;cur != null ; cur = cur.next){
            size++;
        }
        return size;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值