判断一串数字或者一个字符串是否回文,是一个编程的基本问题。这里我根据自己最近回顾数据结构相关知识,java语言实现两个经典案例。
1.利用String存储字符串,判断是否为回文字符串。
这个解决比较简单,i和j分别从String的前后进行遍历进行比较 一次得到是否为回文字符串。
import java.util.Scanner;
/**
* 利用String解决回文字符串问题
* @author xjh 2018.10.08
*
*/
public class ToString {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
for(int i=0,j=s.length()-1;i<s.length()/2;i++,j--){
if(s.charAt(i)!=s.charAt(j)){
System.out.println(s+" not huiwen String");
return ;
}
}
System.out.println(s+" is huiwen String");
}
}
2.利用单链表来存储字符串,如何让利用单链表的性质来得到是否为回文链表
这是一道很有意思的题目,也是学习应用单链表的一个demo。我们知道单链表是线性表的一种典型。可用物理上不连续的内存地址去存储逻辑上相邻的数据结构。插入删除元素的时间复杂度低,但是无法像数组那样支持随机访问。
回到回文序列这个问题上,因为单链表的特殊性质,数据访问只能够从单链表的头节点出发,沿着链表节点的next指针逐个向下遍历。所以 这里我们巧妙的利用快进慢进两个指针,从head节点开始遍历,指针n1一次进以,指针n2一次进二。当n2指向的下一个为空时,n1当前指向为链表中间节点。然后后半部分的节点逆序复原,使得前后半部分的节点比较 得出是否回文。
import java.util.Scanner;
/**
* 利用单链表存储输入的字符串,判断是否为回文
* @author xjh 2018.10.08
*
*/
class Node{ //定义节点类
char data;
Node next;
public Node(char t){
this.data=t;
}
}
public class ToSingleLinkedList {
public static boolean IsHuiwen(Node head){
Node n1=head;
Node n2=head;
// System.out.println(n2.next.next.data);
while(n2.next!=null&&n2.next.next!=null){
//这里有个很容易出错的地方是 如果while循环的循环条件没有加上n2.next!=null则会抱空指针异常,以为当n2已经是最后一个了 则不存在n2.next.next
//快慢指针 n2前进2步 n1前进1步
n1=n1.next;
n2=n2.next.next;
}//循环结束时n2指向最末尾节点,n1刚好指向中间节点
n2=n1.next;
Node pre=n1;
Node next=null;
while(n2!=null){
//后半部分节点逆序指向
next=n2.next;
n2.next=pre;
pre=n2;
n2=next;
}
n1.next=null;
n2=pre;
n1=head;
while(n1.next!=null&&n2.next!=null){
//原单链表的前后节点 进行逐一比较
if(n1.data!=n2.data)
return false;
n1=n1.next;
n2=n2.next;
}
return true;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
String tmp=in.nextLine();
char[] s=tmp.toCharArray();
Node[] node=new Node[s.length];
for(int i=0;i<s.length;i++){
node[i]=new Node(s[i]);
}
for(int i=0;i<s.length;i++){
if(i==s.length-1){ //最后一个节点,指针指向空
node[i].next=null;
}
else node[i].next=node[i+1];
}
boolean flag=IsHuiwen(node[0]);
System.out.println("链表是回文吗? "+flag);
}
}