Palindrome Linked List

原创 2015年07月10日 10:27:53

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?

Show Tags

Have you met this question in a real interview?

题意:本来想将链表转为字符串,revers后和原字符串比较,但是链表的元素可能为负数,所以翻转无效,而且相当于o(n)的space复杂度,不符合题意。判断一个单链表是否为回文的。用O(1)的空间,就是只能用有限的变量,在原来的空间大小上折腾。


思路:用两个指针,一个一次跑1步,另外的一个一次跑2步,翻转链表的后半部分,于是后半部分和前半部分,一个一个的比较。由于没有嵌套循环,所以时间复杂度还是O(n)

代码如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public boolean isPalindrome(ListNode head) {
        if(head==null||head.next == null) return true;
        ListNode pre = new ListNode(-1);
        pre.next = head;
        ListNode slow = pre;
        ListNode fast = pre;
        //while的目的是找到链表的中间地方,用slow表示
        while(fast!=null && fast.next!=null){
            slow = slow.next;
            fast = fast.next.next;
        }
        
        ListNode left = head;
        //把链表的后半部分翻转,再来和前半部分比较
        ListNode right = reverseList(slow.next);
        slow.next = right;
        boolean result = true;
        while(right!=null){
            if(right.val!=left.val){
                result = false;
                break;
            }else{
                left = left.next;
                right = right.next;
            }
            
            
        }
        //人家只是让判断是否回文,尽量不要修改原始链表数据,所以再将后半部分翻转回去
        slow.next = reverseList(slow.next);
        return result;
            
    }
    
    
      public ListNode reverseList(ListNode head) {  
        if(head==null||head.next==null) return head;  
          
        ListNode pre = head;  
        ListNode cur = head.next;  
        ListNode nex = head.next.next;  
        pre.next =null; //切断第一个元素的next指向,因为逆转前的第一个元素就是你转后的最后一个,它的next应该为null  
        while(cur!=null){  
            
            cur.next = pre;  
            pre = cur;  
            cur = nex;  
            if(nex!=null){    //链表只有2个元素的时候,会出现nex一上来就为null,加个判断避免出现空指针异常  
               nex = nex.next;   
            }         
        }  
        return pre;  
    }  
}



234. Palindrome Linked List [easy] (Python)

题目链接https://leetcode.com/problems/palindrome-linked-list/题目原文 Given a singly linked list, determin...

<LeetCode OJ> 234. Palindrome Linked List

234. Palindrome Linked List My Submissions Question Total Accepted: 33856 Total Submissions: 129...

LeetCode 234. Palindrome Linked List(对称链表)

原题网址:https://leetcode.com/submissions/detail/58253344/ Given a singly linked list, determine if it...
  • jmspan
  • jmspan
  • 2016年04月06日 05:36
  • 532

leetcode No234. Palindrome Linked List

QuestionGiven a singly linked list, determine if it is a palindrome. 判断链表是否为回文Algorithm需要解决的问题: 1、...

234. Palindrome Linked List

题目描述: Given a singly linked list, determine if it is a palindrome. Follow up: Could you do it in O...

[leetcode] Palindrome Linked List

题目链接在此 Given a singly linked list, determine if it is a palindrome. Follow up: Could yo...

234.[LeetCode]Palindrome Linked List

一个要求时间复杂度是 O(n),空间复杂度是 O(1) 的判断链表是否是回文的// 时间和空间复杂度都有限的情况下来做运算 // 还是很简单的,遍历一遍链表,使用两个数,正向和逆向的存储我们的链表(1...

[理解leetcode解法]234. Palindrome Linked List 回文链表

[理解leetcode解法]234. Palindrome Linked List 回文链表 Given a singly linked list, determine if it is a pal...

LeetCode-Easy部分标签为LinkedList 234. Palindrome Linked List

根据回文数定义和单链表特点,求单链表是否为回文链表。要求时间复杂度O(n),空间复杂度O(1)。 思路,将后半部分反转,与前半部分元素一一比较。...

234. Palindrome Linked List (Easy)

Given a singly linked list, determine if it is a palindrome. Follow up: Could you do it in O(n)...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Palindrome Linked List
举报原因:
原因补充:

(最多只允许输入30个字)