Palindrome Linked List
2015-07-10 10:27
253 查看
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)
代码如下:
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; } }
相关文章推荐
- System.in.read() 回车
- Python中获取异常(Exception)信息
- dada
- 用转换器把ppt转为pdf的详细步骤
- linux系统怎么重启网卡?linux重启网卡的三种教程
- Linux下halt,poweroff,reboot,shutdown命令的区别
- org.testng.TestNGException: Cannot find class in classpath
- UITableViewCell重叠
- iOS将颜色转换image方法
- Scala 函数式编程
- jQuery.extend 函数详解
- Add Two Numbers
- leetCode 41.First Missing Positive (第一个丢失的正数) 解题思路和方法
- 详解Java GC的工作原理
- 做一个屌但不屌丝的软件开发工程师
- PDF处理工具
- 朴素贝叶斯分类算法(3)
- window系统的HOST详解
- 查看进程所消耗的内存
- 查看进程所消耗的内存