栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

LeetCode -234 - 回文链表 - Java - 三种解法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode -234 - 回文链表 - Java - 三种解法

文章目录
  • 这题并不难,但是解法多样,所以作者觉得有必要写写!
  • 题目
  • 解法一(快慢指针 + 反转)
    • 代码
    • 附图
  • 解法二 - 通过将链表节点的val值 存入 顺序表/数组 中, 通过数组下标进行对比。
    • 代码
    • 附图
  • 解法三 - 递归
    • 代码
    • 附图

这题并不难,但是解法多样,所以作者觉得有必要写写! 题目

那上面例子来说: 就是链表的val值, 从左往右看(1,2,2,1)和 从右往左看(1,2,2,1),都是一样的,就返回true , 否则返回 false。


解法一(快慢指针 + 反转)

先使用快慢指针,得到中间节点,然后反转 中间后半部分 链表节点,然后就是判断回文

代码
class Solution {
    public boolean isPalindrome(ListNode head) {
        if(head == null){
            return true;
        }
        ListNode fast = head;
        ListNode slow = head;
        while(fast!=null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
        }
        ListNode cur = slow.next;
        while(cur!=null){
            ListNode curNext = cur.next;
            cur.next = slow;
            slow = cur;
            cur = curNext;
        }
        while(head!=slow){
            if(head.val != slow.val){
                return false;
            }
            if(head.next == slow){
                return true;
            }
            head = head.next;
            slow = slow.next;
        }
        return true;
    }
}

附图


解法二 - 通过将链表节点的val值 存入 顺序表/数组 中, 通过数组下标进行对比。 代码
class Solution {
    public boolean isPalindrome(ListNode head) {
        List list = new ArrayList<>();
        ListNode currentNode = head;
        while(currentNode != null){
            list.add(currentNode.val);
            currentNode = currentNode.next;
        }
        int front = 0;
        int back = list.size()-1;
        while(front < back){
            if(list.get(front) != list.get(back) ){
                return false;
            }
            front++;
            back--;
        }
        return true;
    }
}

附图


解法三 - 递归

递归方法就是效率低了。

代码
class Solution {
    private ListNode frontPointer;
    public boolean isPalindrome(ListNode head) {
        frontPointer = head;
        return recursive(head);
    }
    private  boolean recursive(ListNode currentNode){
        if(currentNode != null){
            if(!recursive(currentNode.next)){
                return false;
            }
            if(currentNode.val != frontPointer.val){
                return false;
            }
            frontPointer =frontPointer.next;
        }
        return true;
    }
}

附图

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/677259.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号