如何在java中检查链表是否为回文
时间:2020-02-23 14:34:15 来源:igfitidea点击:
在本教程中,我们将看到如何检查链接列表是否是回文。
算法:
- 使用慢速和快速指针方法查找链接列表的中间元素。
- 反转链接列表的第二部分
- 比较链接列表的第一个和第二部分如果它匹配,则链接列表是palindrome。
Java程序:
package org.igi.theitroad;
public class LinkedListPalindromeCheck{
private Node head;
private static class Node {
private int value;
private Node next;
Node(int value) {
this.value = value;
}
}
public void addToTheLast(Node node) {
if (head == null) {
head = node;
} else {
Node temp = head;
while (temp.next != null)
temp = temp.next;
temp.next = node;
}
}
public void printList() {
Node temp = head;
while (temp != null) {
System.out.format("%d ", temp.value);
temp = temp.next;
}
System.out.println();
}
//This function will find middle element in linkedlist
public static Node findMiddleNode(Node head)
{
//step 1
Node slowPointer, fastPointer;
slowPointer = fastPointer = head;
while(fastPointer !=null) {
fastPointer = fastPointer.next;
if(fastPointer != null && fastPointer.next != null) {
slowPointer = slowPointer.next;
fastPointer = fastPointer.next;
}
}
return slowPointer;
}
//Function to check if linked list is palindrome or not
public static boolean checkPalindrome (Node head)
{
//Find middle node using slow and fast pointer
Node middleNode=findMiddleNode(head);
//we got head of second part
Node secondHead=middleNode.next;
//It is end of first part of linked list
middleNode.next=null;
//get reversed linked list for second part
Node reverseSecondHead=reverseLinkedList(secondHead);
while(head!=null && reverseSecondHead!=null)
{
if(head.value==reverseSecondHead.value)
{
head=head.next;
reverseSecondHead=reverseSecondHead.next;
continue;
}
else
{
return false;
}
}
return true;
}
public static Node reverseLinkedList(Node currentNode)
{
//For first node, previousNode will be null
Node previousNode=null;
Node nextNode;
while(currentNode!=null)
{
nextNode=currentNode.next;
//reversing the link
currentNode.next=previousNode;
//moving currentNode and previousNode by 1 node
previousNode=currentNode;
currentNode=nextNode;
}
return previousNode;
}
public static void main(String[] args) {
LinkedListPalindromeCheck list = new LinkedListPalindromeCheck();
//Creating a linked list
Node head=new Node(1);
list.addToTheLast(head);
list.addToTheLast(new Node(2));
list.addToTheLast(new Node(1));
list.addToTheLast(new Node(2));
list.addToTheLast(new Node(1));
list.printList();
System.out.println("Linked list palidrome: "+checkPalindrome(head));
}
}
运行上面的程序时,我们将获取以下输出:
1 2 1 2 1 Linked list palidrome: true
时间复杂性:O(n)空间复杂性:O(1)

