leetcode234. 回文链表

导读:本篇文章讲解 leetcode234. 回文链表,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

题目

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

示例 1:
在这里插入图片描述

输入:head = [1,2,2,1]
输出:true
示例 2:
在这里插入图片描述

输入:head = [1,2]
输出:false

提示:

链表中节点数目在范围[1, 105] 内
0 <= Node.val <= 9

分析

使用快慢指针+反转链表完成
1、快慢指针的目的找到中点后进行反转,反转后将对应的后续链表进行反转
2、反转链表与head节点进行一 一比较即可

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    /** 视频讲解:
    https://www.bilibili.com/video/BV1VZ4y1e7aR?spm_id_from=333.337.search-card.all.click&vd_source=3f506dfd7b2a19c74f99363591d70f4c**/

    // 使用快慢指针+反转链表去完成
    public boolean isPalindrome(ListNode head) {
        // 定义快慢指针
        ListNode slow=head;
        ListNode fast=head;
        // 当快指针为空时找到中间节点(因为有奇数和偶数所以使用&&)
        while(fast.next!=null && fast.next.next!=null){
            slow=slow.next;
            fast=fast.next.next;
        }
        // 在slow.next之后的链表进行反转
        ListNode newListNode = reverseList(slow.next);
        // 比较
        while(newListNode!=null){
            if(newListNode.val!=head.val){
                return false;
            }
            newListNode=newListNode.next;
            head=head.next;
        }
        return true;

    }

    // 定义反转函数(递归)
    private static ListNode reverseList(ListNode head){
        // base
        if(head==null||head.next==null){
            return head;
        }
        ListNode last=reverseList(head.next);
        head.next.next=head;
        head.next=null;
        return last;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/96234.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!