📜  用循环检查链表是否为回文的Java程序(1)

📅  最后修改于: 2023-12-03 15:11:18.688000             🧑  作者: Mango

用循环检查链表是否为回文的Java程序介绍

这是一个Java程序,用于检查给定的链表是否为回文。

回文链表是什么?

回文链表是指,一个单向链表的正反遍历都能够获得相同的值序列。例如,以下三种链表都是回文链表:

  • 1 -> 2 -> 3 -> 2 -> 1
  • 1 -> 2 -> 3 -> 3 -> 2 -> 1
  • 1 -> 3 -> 3 -> 1
程序实现原理

这个程序的实现原理很简单:用两个指针,一个快指针和一个慢指针,从链表的头开始遍历。慢指针每次移动一个节点,而快指针每次移动两个节点。

当快指针遍历到链表的末尾时,慢指针的位置就指向链表的中间节点。然后,我们将慢指针的后面一半链表进行反转,再用两个指针分别从链表的头和中间节点开始遍历比较。如果两个指针遍历到的节点值都相等,那么这个链表就是回文的。

程序实现代码

以下是实现上述算法的Java代码:

public class LinkedListPalindromeChecker {
    public static boolean isPalindrome(ListNode head) {
        if (head == null || head.next == null) {
            return true;
        }

        // 快慢指针寻找链表的中间节点
        ListNode slow = head;
        ListNode fast = head;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }

        // 反转后面一半链表
        ListNode pre = null;
        ListNode cur = slow;
        while (cur != null) {
            ListNode nextTemp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = nextTemp;
        }

        // 比较两个指针遍历到的节点值是否相等
        ListNode p1 = head;
        ListNode p2 = pre;
        while (p2 != null) {
            if (p1.val != p2.val) {
                return false;
            }
            p1 = p1.next;
            p2 = p2.next;
        }
        return true;
    }
}

class ListNode {
    int val;
    ListNode next;

    ListNode(int val) {
        this.val = val;
    }
}
如何测试?

可以创建一些自定义的测试用例进行测试,例如:

public static void main(String[] args) {
    ListNode head1 = new ListNode(1);
    head1.next = new ListNode(2);
    head1.next.next = new ListNode(3);
    head1.next.next.next = new ListNode(2);
    head1.next.next.next.next = new ListNode(1);
    System.out.println(LinkedListPalindromeChecker.isPalindrome(head1));  // true

    ListNode head2 = new ListNode(1);
    head2.next = new ListNode(2);
    head2.next.next = new ListNode(3);
    head2.next.next.next = new ListNode(3);
    head2.next.next.next.next = new ListNode(2);
    head2.next.next.next.next.next = new ListNode(1);
    System.out.println(LinkedListPalindromeChecker.isPalindrome(head2));  // true

    ListNode head3 = new ListNode(1);
    head3.next = new ListNode(3);
    head3.next.next = new ListNode(3);
    head3.next.next.next = new ListNode(1);
    System.out.println(LinkedListPalindromeChecker.isPalindrome(head3));  // true

    ListNode head4 = new ListNode(1);
    head4.next = new ListNode(2);
    System.out.println(LinkedListPalindromeChecker.isPalindrome(head4));  // false
}