LeetCode OJ:Palindrome Linked List(回文链表判断)

Given a singly linked list, determine if it is a palindrome.

Follow up:
Could you do it in O(n) time and O(1) space?

判断一个链表是否为回文链表,有很多方法都可以进行判断,可以先遍历链表然后将值全部存储到vector之中,也可以遍历链表然后将list中的值都压倒堆栈中再和List进行比较,

但是想要达到题目上面的 时间复杂度为O(n),而空间复杂度为O(1)还要用到递归:

首先是不用递归的方法(使用一个栈):

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     bool isPalindrome(ListNode* head) {
12         ListNode * tmpHead = head;
13         stack<int> lt;
14         while (tmpHead){
15             lt.push(tmpHead->val);
16             tmpHead = tmpHead->next;
17         }
18 
19         while (!lt.empty()){
20             if (head->val != lt.top()) return false;
21             lt.pop();
22             head = head->next;
23         }
24         return true;
25     }
26 };

java版本的代码:

 1 public class Solution {
 2     public boolean isPalindrome(ListNode head) {
 3         ListNode p = head;
 4         Stack<ListNode> s = new Stack<ListNode>();
 5         while (p != null) {
 6             s.push(p);
 7             p = p.next;
 8         }
 9         while(!s.isEmpty()){
10             if(head.val != s.pop().val)
11                 return false;
12             head = head.next;
13         }
14         return true;
15     }
16 }

 

首先上面这个空间复杂度是不满足要求的,再者,既然想到了将元素压入栈中,那么结合递归的话,应该就能做到空间复杂度O(1)了,应为上面的方法用到了堆栈,与递归能很好的结合:

 1 class Solution{
 2 private:
 3     ListNode * theHead;
 4 
 5 public:
 6     bool isPalindrome(ListNode* head) {
 7         theHead = head;  //先将head保存到一个theHead里面,便于与后面的递归了得指针相比较。
 8         return valid(head);
 9     }
10 
11     bool valid(ListNode * first)
12     {
13         if (first == NULL) return true;
14         if (valid(first->next) == false) return false;
15         if (first->val == theHead->val){
16             theHead = theHead->next;
17             return true;
18         }
19         else
20             return false;
21     }
22 };

因为道理比较简单,所以就不一一赘述了。

java版本的代码如下所示:

 1 public class Solution {
 2     ListNode helper;
 3     public boolean isPalindrome(ListNode head) {
 4         helper = head;
 5         return isValid(head);
 6     }
 7 
 8     public boolean isValid(ListNode first){
 9         if(first == null) return true;
10         if(isValid(first.next) == false) return false;
11         if(first.val == helper.val){
12             helper = helper.next;
13             return true;
14         }else
15             return false;
16     }
17 }

 

posted @ 2015-10-08 20:48  eversliver  阅读(290)  评论(0编辑  收藏  举报