美文网首页
Leetcode 234 回文链表

Leetcode 234 回文链表

作者: itbird01 | 来源:发表于2022-01-17 07:42 被阅读0次

234. 回文链表

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

解题思路

解法1:
1.对链表进行遍历,转换为字符串
2.对字符串采用双指针遍历方法(两个指针,一个从前往后,一个从后往前),判断是否为回文字符串
此解法,时间复杂度是O(n),空间复杂度是O(n)
运行效率为:


解法1运行效率

解法2:
1.翻转链表
2.遍历对比翻转链表和输入链表,判断值是否相等
此解法,时间复杂度是O(n),空间复杂度是O(n)
运行效率为:


解法2运行效率

解题遇到的问题

1.翻转链表,可以使用哑结点的方法
中心思想是:
1)创建哑结点new ListNode(0);
2)遍历head,每次遍历,将哑结点的next先保存下来
3)将哑结点的next指向目前遍历到的head值的节点
4)再将这次遍历临时保存下来的哑结点的next节点,重新连接到哑结点的m.next.next = temp
5)直到head为null,遍历完成,m.next即为翻转后的链表
模版代码为:

/**
     * 翻转链表 
     */
    public ListNode revListNode(ListNode head) {
        ListNode m = new ListNode(0);
        ListNode temp = null;
        while (head != null) {
            temp = m.next;
            m.next = new ListNode(head.val);
            head = head.next;
            m.next.next = temp;
        }
        return m.next;
    }

2.求取链表中的倒数节点,可以使用快慢指针的方法
中心思想是:
1)双指针移动,初始都指向head
2)先将p1移动k位
3)然后才开始移动p2,同时继续移动p1
4)直到p1指向末尾,那么p2将会移动L-k个位置,那么p2此时指向为倒数第k个节点
模版代码为:

    /**
     * 快慢指针找到链表的倒数k节点
     */
    public ListNode getNthKNode(ListNode head, int k) {
        ListNode p1 = head, p2 = head;
        while (p1 != null) {
            p1 = p1.next;
            if (k < 1) {
                p2 = p2.next;
            }
            k--;
        }
        return p2;
    }

后续需要总结学习的知识点

##解法1
class Solution {
    public boolean isPalindrome(ListNode head) {
        StringBuilder builder = new StringBuilder();
        while (head != null) {
            builder.append(head.val);
            head = head.next;
        }
        int l = 0, r = builder.length() - 1;
        while (l < r) {
            if (builder.charAt(l) != builder.charAt(r)) {
                return false;
            }
            l++;
            r--;
        }
        return true;
    }

    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;
        }
    }
}

##解法2
class Solution {
    public boolean isPalindrome(ListNode head) {
        ListNode reListNode = revListNode(head);
        while (head != null || reListNode != null) {
            System.out.println(head.val + "  " + reListNode.val);
            if (head.val != reListNode.val) {
                return false;
            }
            head = head.next;
            reListNode = reListNode.next;
        }
        return true;
    }

    /**
     * 翻转链表 
     */
    public ListNode revListNode(ListNode head) {
        ListNode m = new ListNode(0);
        ListNode temp = null;
        while (head != null) {
            temp = m.next;
            m.next = new ListNode(head.val);
            head = head.next;
            m.next.next = temp;
        }
        return m.next;
    }
    /**
     * 快慢指针找到链表的中间节点
     */
    public ListNode getMidNode(ListNode head) {
        ListNode p1 = head, p2 = head;
        while (p2.next != null) {
            p1 = p1.next;
            p2 = p2.next.next;
        }
        return p1;
    }

    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;
        }
    }
}

相关文章

  • 234. 回文链表

    234. 回文链表[https://leetcode.cn/problems/palindrome-linked-...

  • LeetCodeEmm

    234. 回文链表[https://leetcode-cn.com/problems/palindrome-lin...

  • 234. 回文链表

    234. 回文链表[https://leetcode-cn.com/problems/palindrome-lin...

  • Leetcode 234 回文链表

    234. 回文链表[https://leetcode-cn.com/problems/palindrome-lin...

  • 链表 Leetcode 234 回文链表

    题目 请判断一个链表是否为回文链表。 示例 1: 输入: 1->2输出: false示例 2: 输入: 1->2-...

  • LeetCode 234——回文链表

    1. 题目 请判断一个链表是否为回文链表。 示例 1:输入: 1->2输出: false示例 2: 输入: 1->...

  • 如何判断回文链表

    读完本文,你可以去力扣拿下如下题目: 234.回文链表[https://leetcode-cn.com/probl...

  • LeetCode|234.回文链表

    题目描述 等级: 简单请判断一个链表是否为回文链表。 示例 1: 示例 2: 进阶:你能否用 O(n) 时间复杂度...

  • LeetCode 234. 回文链表

    234. 回文链表 请判断一个链表是否为回文链表。 示例 1: 输入: 1->2输出: false 示例 2: 输...

  • leetCode.234 - 回文链表

    题目 请判断一个链表是否为回文链表。示例 1: 示例 2: 进阶:你能否用 O(n) 时间复杂度和 O(1) 空间...

网友评论

      本文标题:Leetcode 234 回文链表

      本文链接:https://www.haomeiwen.com/subject/dreyxrtx.html