您的位置:首页 > 编程语言 > Java开发

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) {
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 
   嗯。。这个叫西施豆腐渣的博主已经深深印在我的脑海里。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: