经典案例-回文序列 Java String(Char)存储实现 单链表存储实现

判断一串数字或者一个字符串是否回文,是一个编程的基本问题。这里我根据自己最近回顾数据结构相关知识,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

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

 

你可能感兴趣的:(面试基础,算法和数据结构,Java)