234. Palindrome Linked List java leetcode
2016-05-28 15:50
459 查看
题目:判断一个链表是否是回文
就是诸如1-2-3-2-1 1-2-3-3-2-1 奇数个或者偶数个这样的。
方法一:
快慢指针,前半部分放入栈中,快指针到达结尾,慢指针到达中间,然后慢指针继续后续遍历,和栈中的弹出来一个个比较。若一旦有不同就return false,都一样就最后返回true。
方法二:
将链表切割为两部分,再将某一部分进行inverse反转链表,再对两个链表挨个比较。若一旦有不同就return false,都一样就最后返回true。
方法一代码:
方法二代码:
public class Solution {
public boolean isPalindrome(ListNode head) {
if(head==null || head.next==null) return true;
ListNode middle= partition(head);
middle= reverse(middle);
// ListNode middle= reverse(middle);
while(head!=null && middle!=null){//前半截和 反转后的后半段进行一一比较
if(head.val!=middle.val) return false;
head=head.next;
middle=middle.next;
}
return true;
}
private ListNode partition(ListNode head){//将头结点为head的链表分成两段,返回后半段的头结点P
// ListNode p;
ListNode p=head;
while(p.next!=null && p.next.next!=null){
head=head.next;
p=p.next.next;
}
p=head.next;
head.next=null;
return p;
}
private ListNode reverse(ListNode head){//将头结点为head的链表反转,返回反转后的头结点pre
if(head==null || head.next==null) return head;
ListNode pre=head;
ListNode cur=head.next;
pre.next=null;//这句不能漏~!! 要把前后关系该断断 该连连
ListNode nxt=null;
while(cur!=null){//
nxt=cur.next;
cur.next=pre;
pre=cur;
cur=nxt;
}
return pre;
}
}
参见参考资料3
参考资料:
1、cracking the coding interview / page129 (本书给出了三种方法,递归掌握的不好,第三种递归方法还木有掌握)
2、使用递归和非递归方式反转单向链表
3、leetcode 234: Palindrome Linked List
嗯。。这个叫西施豆腐渣的博主已经深深印在我的脑海里。。
就是诸如1-2-3-2-1 1-2-3-3-2-1 奇数个或者偶数个这样的。
方法一:
快慢指针,前半部分放入栈中,快指针到达结尾,慢指针到达中间,然后慢指针继续后续遍历,和栈中的弹出来一个个比较。若一旦有不同就return false,都一样就最后返回true。
方法二:
将链表切割为两部分,再将某一部分进行inverse反转链表,再对两个链表挨个比较。若一旦有不同就return false,都一样就最后返回true。
方法一代码:
public class Solution { public boolean isPalindrome(ListNode head) { ListNode fast=head; ListNode slow=head; Stack<Integer> stack=new Stack<Integer>(); while(fast!=null && fast.next!=null){ stack.push(slow.val);//入栈 slow=slow.next;//慢指针 fast=fast.next.next;//快指针 } if(fast!=null){ slow=slow.next;//如果fast指针不是空,证明链表个数是奇数个,所以最中间那个数要跳过去(可以实际画个链表走一下) } while(slow!=null){//接下来开始比较后半段链表和栈中 int val=stack.pop().intValue();//栈里弹出来,并转换成intValue值 if(val!=slow.val){//一旦不一样就返回false return false; } slow=slow.next;//慢指针在后半段一个个往后挪,进行比较 } return true; } }
方法二代码:
public class Solution {
public boolean isPalindrome(ListNode head) {
if(head==null || head.next==null) return true;
ListNode middle= partition(head);
middle= reverse(middle);
// ListNode middle= reverse(middle);
while(head!=null && middle!=null){//前半截和 反转后的后半段进行一一比较
if(head.val!=middle.val) return false;
head=head.next;
middle=middle.next;
}
return true;
}
private ListNode partition(ListNode head){//将头结点为head的链表分成两段,返回后半段的头结点P
// ListNode p;
ListNode p=head;
while(p.next!=null && p.next.next!=null){
head=head.next;
p=p.next.next;
}
p=head.next;
head.next=null;
return p;
}
private ListNode reverse(ListNode head){//将头结点为head的链表反转,返回反转后的头结点pre
if(head==null || head.next==null) return head;
ListNode pre=head;
ListNode cur=head.next;
pre.next=null;//这句不能漏~!! 要把前后关系该断断 该连连
ListNode nxt=null;
while(cur!=null){//
nxt=cur.next;
cur.next=pre;
pre=cur;
cur=nxt;
}
return pre;
}
}
参见参考资料3
参考资料:
1、cracking the coding interview / page129 (本书给出了三种方法,递归掌握的不好,第三种递归方法还木有掌握)
2、使用递归和非递归方式反转单向链表
3、leetcode 234: Palindrome Linked List
嗯。。这个叫西施豆腐渣的博主已经深深印在我的脑海里。。
相关文章推荐
- 数值分析中的高斯—塞德尔迭代算法
- EGit/FAQ
- Spring-注解实现Bean
- Java内存结构
- rxJava的使用--Observable的创建及源码分析(二)
- 西邮ThoughtCoding实验室2016纳新笔试题(Java部分,面向大一大二,带参考答案)
- Java开发必装的IntelliJ IDEA插件
- 面向对象(实现相应功能操作)
- javax.xml.ws.WebServiceException: Provider com.sun.xml.ws.spi.ProviderImpl not found
- STS中The type javax.servlet.ServletContext cannot
- Java开发常用的在线工具
- Java 简单高效处理字符串-删除所有标点,正则表达式
- spring mvc 中文乱码
- Java实现邮箱激活验证2
- Java实现邮箱激活验证
- SpringMVC返回json是设置编辑等消息头,消息头信息介绍(respone.setHeader,这个从网上获取)
- SpringMVC返回json是设置编辑等消息头,消息头信息介绍(respone.setHeader,这个从网上获取)
- java反射
- myeclipse编写的一个简单登陆程序
- JAVA模式设计-简单工厂模式