2.7问题:
编写一个函数,检查链表是否为回文。
思考:若链表长度未知,可用快慢runner指针的方法,迭代访问链表将链表的前半部分入栈,然后将栈内的数据与链表的后半部分进行对比。
import java.util.*;
//节点类
class Node {
protected Node next; //指针域
protected int data;//数据域
public Node( int data) {
this.data = data;
}
//显示此节点
public void display() {
System. out.print( data + " ");
}
}
//单链表
class LinkList {
public Node first; // 定义一个头结点
private int pos = 0;// 节点的位置
public LinkList() {
this.first = null;//this代表当前类
}
// 插入一个头节点
public void addFirstNode( int data) {
Node node = new Node(data);
node. next = first;
first = node;
}
// 显示出所有的节点信息
public void displayAllNodes() {
Node current = first;
while (current != null) {
current.display();
current = current. next;
}
System. out.println();
}
}
class isPalindrome{
public static void main(String args[]){
LinkList linkList = new LinkList();
linkList.addFirstNode(1);
linkList.addFirstNode(2);
linkList.addFirstNode(3);
linkList.addFirstNode(4);
linkList.addFirstNode(5);
linkList.addFirstNode(6);
linkList.addFirstNode(5);
linkList.addFirstNode(4);
linkList.addFirstNode(3);
linkList.addFirstNode(2);
linkList.addFirstNode(1);
System.out.println("原链表为:");
linkList.displayAllNodes();
if(isPalindrome(linkList.first)){
System.out.println("是回文!");
}
else{
System.out.println("不是回文!");
}
}
public static boolean isPalindrome(Node head){
Node fast =head;
Node slow =head;
Stack<Integer> stack = new Stack<Integer>();
/*将链表前半部分元素入栈。当快速runner到达链表尾部的时候,则慢速runner已经处在链表中间位置。*/
while(fast!=null&&fast.next!=null){
stack.push(slow.data);
slow=slow.next;
fast=fast.next.next;
}
/*链表有奇数个元素,跳过中间元素*/
if(fast!=null)
{
slow=slow.next;
}
while(slow!=null){
int top = stack.pop().intValue();
/*若两者不相同,则该链表不是回文序列*/
if(top!=slow.data){
return false;
}
slow=slow.next;
}
return true;
}
}