Leetcode-234.回文链表

题目描述
请判断一个链表是否为回文链表。

示例 1:

输入: 1->2
输出: false
示例 2:

输入: 1->2->2->1
输出: true
运行结果
图片说明
解题思路
第一份代码:先找到中间坐标,再反转后半段链表,再进行比较---利于模板框架
第二份代码:反转前半段代码,但是思路不好想
利用快慢指针和链表倒置的思想
自己做时,只想到了用快慢指针找到中间位置,但是发现没法比较(没有想到将前半段的链表进行倒置)
其他用数组保存或者栈保存数值的方法都不再描述,不太高效
java代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
        //找到链表的中间位置
        ListNode low=head,fast=head;
        while(fast != null && fast.next !=null){
            low=low.next;
            fast=fast.next.next;
        }
        if(fast != null)  low=low.next;
        //将后半段链表反转
        ListNode left=head;
        ListNode right=reverse(low);
        //比较反转后的数值
        while(right != null){
            if(left.val !=right.val){
                return false;
            }
            left=left.next;
            right=right.next;
        }
        return true;

    }
    //从head到结尾反转链表
    public ListNode reverse(ListNode head){
        ListNode pre,cur,nxt;
        pre=null;
        cur=nxt=head;
        while(cur != null){
            nxt=cur.next;
            cur.next=pre;
            pre=cur;
            cur=nxt;
        }
        return pre;
    }
}
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
        //找到链表的中间位置
        ListNode start=head;
        ListNode mid=start;
        //利用pre和prepre对前半段进行倒置
        ListNode prepre=null;
        ListNode pre=head;
        while(start != null && start.next != null){
            pre=mid;
            start=start.next.next;
            mid=mid.next;
            pre.next=prepre;
            prepre=pre;
        }
        //证明为奇数个,则mid需要再往右一个(中间的不比较)
        if(start != null) mid=mid.next;

        while(pre != null && mid != null){
            if(pre.val != mid.val){
                return false;
            }
            mid=mid.next;
            pre=pre.next;
        }
        return true;

    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-19 20:55
因为业务不是喜欢的,所以就没去,现在实习工作也有很多dirtywork,很后悔,怎么能舔回这个offer啊
flmz_Kk:试一试跟hr舔回来,不过保不齐米的活也有很多dirtywork,只能说不要美化自己没走过的路
点赞 评论 收藏
分享
牛客848095834号:举报了
点赞 评论 收藏
分享
后来123321:别着急,我学院本大二,投了1100份,两个面试,其中一个还是我去线下招聘会投的简历,有时候这东西也得看运气
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务