判断一个链表是否是回文链表

判断一个链表是否是回文链表

回文链表

1.找到中间结点
2.中间位置之后的链表翻转

上述两个的方法上两篇文章有写过

3.将第一个链表与第二个链表一次向后遍历,比较

1-2-3-2-1

1-2-3-1-2;

if(A==null){
            return false;
        }
        //找到中间节点
        ListNode first=A;
        ListNode mid=A;//中间结点,作为下一个链表的前驱结点
        //找到中间节点,奇数为中间的,偶数为中间两个的前一个
        while(first.next!=null){
            if(first.next.next!=null){//奇数情况(在最后一步时一定会进入此分支)
                first=first.next.next;
                mid=mid.next;
            }else{//偶数情况,(最后一步一定会进此分支)
                first=first.next;//走这一步是为了结束循环
            }
        }
        ListNode prev=mid;
        ListNode first_1=mid.next;
        if(first_1==null){//如果中间节点的下一个结点为空,那么链表中只有一个结点
            return true;
        }
        ListNode second=first_1.next;
        if(second==null){//如果中间节点的下两个节点为空,中间节点的两边一定只有一个结点  1-2-1结构
            return A.val==first_1.val;
        }
        while(second!=null){//将中间节点后面的结点翻转
            first_1.next=second.next;
            second.next=prev.next;
            prev.next=second;
            second=first_1.next;
            
        }
        ListNode temp=A;
        mid=mid.next;
        while(mid!=null){//比较
            if(mid.val!=temp.val){
                break;
            }
            mid=mid.next;
            temp=temp.next;
        }
        if(mid==null){//如果是回文链表。那么一定走到了链表尾部
            return true;
        }
            return false;
}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45

方法二:将每一个结点的值放到数组里,然后进行比较

public class PalindromeList {
    public boolean chkPalindrome(ListNode A) {
        // write code here
           int size=0;
        for(ListNode temp=A;temp!=null;temp=temp.next){
            size++;
        }
        int[] datas=new int[size];
        int i=0;
        for(ListNode temp=A;temp!=null;temp=temp.next){
            datas[i++]=temp.val;
        }
        i=i-1;
        int j=0;
        for (j=0,i=size-1;j<i;j++,i--){
            if(datas[i]!=datas[j]){
                break;
            }
        }
        if(i<=j){
            return true;
        }
        return false;
    }

---------------------
作者:章鱼四剑客
来源:CSDN
原文:https://blog.csdn.net/weixin_42139044/article/details/88190642
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2019-07-27 20:53  天涯海角路  阅读(199)  评论(0)    收藏  举报