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

Posted moris5013

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断一个链表是不是回文链表相关的知识,希望对你有一定的参考价值。

第一种方法: 额外空间复杂度O(N) ,遍历链表时,将元素入栈,再次遍历时,从栈中弹出元素,比较两者的大小,就可以判断是不是回文链表
第二种方法:利用快慢指针,先找到链表的中间位置,然后反转链表的后半部分,再分别从链表两头遍历比较大小,最后将链表恢复为原始结构

public class PalindromeLinkedList 

    
    public static void main(String[] args) 
        
        Node head = new Node(1);
        head.next = new Node(3);
        head.next.next = new Node(5);
        head.next.next.next = new Node(5);
        head.next.next.next.next  = new Node(3);
        head.next.next.next.next.next  = new Node(1);
        
        display(head);
        
        //快指针每次走二步,慢指针每次走一步,循环结束后,当节点数量为奇数时,slow来到了中间位置,当节点数量为偶数时,slow来到了中间位置(虚线)的前一个
        Node fast = head;
        Node slow = head;
        while(fast.next != null && fast.next.next != null)
             fast = fast.next.next;
             slow = slow.next;
        
        //这里的slow就表示中间节点,记录slow的位置
        Node middle = slow;
        
        //记录中间节点的下一个节点位置
        Node help = slow.next;
        //中间节点指向null
        slow.next = null;
        
        //从help这个节点反转链表
        Node pre = null;
        Node next = null;
        //循环结束后,pre就是最后一个节点
        while(help != null) 
            next = help.next;
            help.next = pre;
            pre = help;
            help = next;
        
        
        //判断是否是回文
        boolean flag = true;
        Node  first = head;
        Node  second = pre;
        while(first != null && second != null) 
            if(first.value != second.value) 
                flag = false;
                break;
            
           first =  first.next;
           second = second.next;
        
        System.out.println(flag);
        
        //将链表恢复为原来的结构
        Node help_restore = pre;
        Node pre_restore = null;
        Node next_restore = null;
        while(help_restore != null) 
            next_restore = help_restore.next;
            help_restore.next = pre_restore;
            pre_restore = help_restore;
            help_restore = next_restore;
        
        middle.next = pre_restore;
        display(head);
        
    

    
    public static  void display(Node head) 
        StringBuilder sb = new StringBuilder();
        while (head != null) 
            sb.append(head.value + " -> ");
            head = head.next;
        
        String res = sb.substring(0, sb.lastIndexOf(" -> "));
        System.out.println(res);
    
    
    public static class Node
        public int value; //
        public Node next; // 下一个节点
 
        public Node(int value) 
            this.value = value;
        
    

 

以上是关于判断一个链表是不是回文链表的主要内容,如果未能解决你的问题,请参考以下文章

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

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

链表--判断一个链表是否为回文结构

判断链表的回文结构

请判断一个链表是否为回文链表。

回文链表