博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
回文链表
阅读量:4041 次
发布时间:2019-05-24

本文共 2138 字,大约阅读时间需要 7 分钟。

DESC:

编写一个函数,检查输入的链表是否是回文的。

 

示例 1:

输入: 1->2

输出: false

示例 2:

输入: 1->2->2->1

输出: true

 

进阶:

你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/palindrome-linked-list-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

CODE1:

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) {        if (head == null || head.next==null) {            return true;        }        List
list = new ArrayList<>(); ListNode temp = head; while (temp!=null) { list.add(temp.val); temp = temp.next; } boolean res = true; for (int i=0,j=list.size()-1; i

 

 

NOTES1:

  1. 集合+双指针
  2. 遍历链表拿到所有值,再用双指针进行判断回文
  3. 时间空间复杂度都是O(n)

 

CODE2:

JAVA:

class Solution {    public boolean isPalindrome(ListNode head) {        if (head == null) {            return true;        }        // 找到前半部分链表的尾节点并反转后半部分链表        ListNode firstHalfEnd = endOfFirstHalf(head);        ListNode secondHalfStart = reverseList(firstHalfEnd.next);        // 判断是否回文        ListNode p1 = head;        ListNode p2 = secondHalfStart;        boolean result = true;        while (result && p2 != null) {            if (p1.val != p2.val) {                result = false;            }            p1 = p1.next;            p2 = p2.next;        }                // 还原链表并返回结果        firstHalfEnd.next = reverseList(secondHalfStart);        return result;    }    private ListNode reverseList(ListNode head) {        ListNode prev = null;        ListNode curr = head;        while (curr != null) {            ListNode nextTemp = curr.next;            curr.next = prev;            prev = curr;            curr = nextTemp;        }        return prev;    }    private ListNode endOfFirstHalf(ListNode head) {        ListNode fast = head;        ListNode slow = head;        while (fast.next != null && fast.next.next != null) {            fast = fast.next.next;            slow = slow.next;        }        return slow;    }}

 

NOTES2:

  1. 使用快慢指针找到链表中间节点,将后半部分链表反转,与前半部分递归进行回文判断
  2. 修改了原链表结构
你可能感兴趣的文章
关于AIS编码解码的两个小问题
查看>>
GitHub 万星推荐:黑客成长技术清单
查看>>
可以在线C++编译的工具站点
查看>>
关于无人驾驶的过去、现在以及未来,看这篇文章就够了!
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
为什么读了很多书,却学不到什么东西?
查看>>
长文干货:如何轻松应对工作中最棘手的13种场景?
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
No.147 - LeetCode1108
查看>>
No.174 - LeetCode1305 - 合并两个搜索树
查看>>
No.175 - LeetCode1306
查看>>
No.176 - LeetCode1309
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>
mysql:sql alter database修改数据库字符集
查看>>
mysql:sql truncate (清除表数据)
查看>>
yuv to rgb 转换失败呀。天呀。谁来帮帮我呀。
查看>>
yuv420 format
查看>>
YUV420只绘制Y通道
查看>>
yuv420 还原为RGB图像
查看>>
LED恒流驱动芯片
查看>>