链表例题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 }
posted @ 2019-01-02 15:20  Spider&Man  阅读(175)  评论(0编辑  收藏  举报