234. Palindrome Linked List java leetcode

题目:判断一个链表是否是回文

就是诸如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     嗯。。这个叫西施豆腐渣的博主已经深深印在我的脑海里。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值