链表例题6:检查链表中的数据是否回文
首先需要用到快慢指针的思想,中间需要栈的一些帮助就可以完成此题。
创建一个快慢指针分别为:fast,slow;开始时他们都指向链表的第一个数据结点,使用一个while循环快指针指向为null时结束,设置快指针一次两步,慢指针一次一步,这样当快指针指向为null时,慢指针指向的这个链表的中心地带,但是这时要注意这个回文的数据个数是为奇还是为偶的问题(因为如果为偶的话则慢指针刚好指的是右边那段数据的第一个结点,而当个数为奇数的时候慢指针指向的是中间那个分界的结点,这个结点是不需要比较的,所以慢指针需要单独向后移动一步),在while的过程中还需要把慢指针前面的部分依次的push进一个栈中,以便后序的比较使用。最后在栈这边出栈,slow这边往后移就,这样一步一步的比较。
代码如下:
1 import java.util.Stack; 2 3 class LinkedList{ 4 Object data; 5 LinkedList next; 6 7 public LinkedList(Object data) { 8 this.data=data; 9 } 10 } 11 12 public class PalindromeLinkedList { 13 14 public static void main(String[] args) { 15 String s[]= {"a","b","c","c","b","a"}; 16 LinkedList head=new LinkedList(null); 17 LinkedList p=head; 18 for(String n : s) 19 { 20 p.next=new LinkedList(n); 21 p=p.next; 22 } 23 24 System.out.print(palindrome(head.next)); 25 } 26 27 28 public static boolean palindrome(LinkedList headNode) { 29 if(headNode==null) 30 return false; 31 32 LinkedList slow=headNode; //慢指针 33 LinkedList fast=headNode; //快指针 34 int i=1; //记录是偶个结点还是奇个结点 35 Stack<Object> leftNode=new Stack<Object>(); 36 if(slow.next==null) 37 return false; 38 //进行数据压栈与slow的移动 39 while(fast!=null) 40 { 41 if(fast.next==null) //有奇数个结点 42 { 43 slow=slow.next; 44 break; 45 } 46 leftNode.push(slow.data); 47 slow=slow.next; 48 fast=fast.next.next; 49 } 50 //进行比较 51 while(slow!=null) 52 { 53 if(leftNode.pop()!=slow.data) 54 return false; 55 slow=slow.next; 56 } 57 return true; 58 59 } 60 }