题目:

Given a singly linked list, determine if it is a palindrome.

Follow up:

Could you do it in O(n) time and O(1) space?

题解:

推断一个链表是不是回文的,这里要求O(n)时间复杂度和O(1)的空间时间复杂度。总共想了三种办法,三种办法都用到了两个指针,符合题目要求的仅仅有最后一种。

第一种办法:用数组倒着存前半段的链表的值。然后和后半段链表的值进行比較。

这样的解法执行的时间最久可能是由于数组倒着插入比較耗时。

代码:

//用数组实现 o(n/2)空间
public static boolean isPalindrome(ListNode head) { // ArrayList<Integer> nodeVal=new ArrayList<>();
LinkedList<Integer> nodeVal=new LinkedList<>(); if(head==null||head.next==null)
return true;
ListNode slow=head;
ListNode fast=head; nodeVal.add(0,slow.val);
while(fast.next!=null&&fast.next.next!=null)
{
fast=fast.next.next;
slow=slow.next;
nodeVal.add(0,slow.val);
} ListNode cur=slow;
if(fast.next!=null)//链表长度为偶数
cur=slow.next;
int i=0;
while(cur!=null)
{
if(nodeVal.get(i)!=cur.val)
return false;
cur=cur.next;
i++;
}
return true;
}

另外一种解法:在第一种的思路的基础上。我们要实现一个倒序,我们干嘛不用现成的数据结构-栈。于是把链表前半段压栈,然后出栈和后面的链表依次比較,这样的执行时间最短。但由于用到了栈还是不符合题目要求。

代码:

 //用栈实现
public static boolean isPalindrome2(ListNode head) { Stack<ListNode> stack=new Stack<>();
ListNode slow=head;
ListNode fast=head; if(fast==null||fast.next==null)//0个节点或是1个节点
return true; stack.push(slow);
while(fast.next!=null&&fast.next.next!=null)
{ fast=fast.next.next;
slow=slow.next;
stack.push(slow);
}
if(fast.next!=null)//链表长度为偶数
slow=slow.next; ListNode cur=slow;
while(cur!=null)
{
if(cur.val!=stack.pop().val)
return false;
cur=cur.next;
}
return true; }

第三种:我们这样想,我们可不能够不借助外在的存储实现倒序呢,事实上是能够的,链表反转的时候我们就没有借助外在存储。

思路是把后半段的原地链表反转然后和前半段进行比較(当然你也能够反转前半段)执行时间略微比另外一种慢一些。可是符合题目O(1)空间复杂度的要求

代码:

	 //链表原地转置实现o(1)空间复杂度
public static boolean isPalindrome3(ListNode head) {
ListNode slow=head;
ListNode fast=head; if(fast==null||fast.next==null)//0个节点或是1个节点
return true; while(fast.next!=null&&fast.next.next!=null)
{
fast=fast.next.next;
slow=slow.next;
}
//对链表后半段进行反转
ListNode midNode=slow;
ListNode firNode=slow.next;//后半段链表的第一个节点
ListNode cur=firNode.next;//插入节点从第一个节点后面一个開始
firNode.next=null;//第一个节点最后会变最后一个节点
while(cur!=null)
{
ListNode nextNode=cur.next;//保存下次遍历的节点
cur.next=midNode.next;
midNode.next=cur;
cur=nextNode;
} //反转之后对前后半段进行比較
slow=head;
fast=midNode.next;
while(fast!=null)
{
if(fast.val!=slow.val)
return false;
slow=slow.next;
fast=fast.next;
}
return true; }

LeetCode234_PalindromeLinkedList (推断是否为回文链表) Java题解的更多相关文章

  1. 领扣(LeetCode)回文链表 个人题解

    请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶:你能否用 O(n) 时间复杂 ...

  2. Java判断链表是否为回文链表

    请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 思路:1.通过快慢指针,来遍历链表 ...

  3. Java实现 LeetCode 234 回文链表

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

  4. lintcode 中等题:Palindrome Linked List 回文链表

    题目 回文链表 设计一种方式检查一个链表是否为回文链表. 样例 1->2->1 就是一个回文链表. 挑战 O(n)的时间和O(1)的额外空间. 解题 法一: 再定义一个链表,存放链表反转的 ...

  5. LeetCode OJ:Palindrome Linked List(回文链表判断)

    Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time ...

  6. 234 Palindrome Linked List 回文链表

    请检查一个链表是否为回文链表. 进阶:你能在 O(n) 的时间和 O(1) 的额外空间中做到吗? 详见:https://leetcode.com/problems/palindrome-linked- ...

  7. [LC]234题 Linked List Cycle (回文链表)(链表)

    ①中文题目 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2输出: false示例 2: 输入: 1->2->2->1输出: true进阶:你能否用 O(n) 时间 ...

  8. LeetCode 234:回文链表 Palindrome Linked List

    ​ 请判断一个链表是否为回文链表. Given a singly linked list, determine if it is a palindrome. 示例 1: 输入: 1->2 输出: ...

  9. leetcode面试题 02.06. 回文链表,解题心路

    目录 leetcode面试题 02.06. 回文链表,解题心路 1.题目描述 2.java语言题解一 3.java语言题解二 4.C语言题解一 leetcode面试题 02.06. 回文链表,解题心路 ...

随机推荐

  1. HTML增加附件

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. wordpress网站底部的运行时间是怎么设置的?

    别人网站底部显示的网站运行时间是什么设置的?是插件的效果吗? 不用插件,一段JS代码就可以实现同样的效果. 复制如下代码到 footer.php 页脚那里 <span id="runt ...

  3. python实现qq机器人qqbot

    title: python实现qq机器人qqbot tags: python date: 2018-6-1 10:19:00 --- 以下内容为转载 一.介绍 qqbot 是一个用 python 实现 ...

  4. vux+vuex+vue+Es6开发微信公众号的坑

    初次开发微信公众号遇到很多问题,可能是基础不怎么牢靠,最近几天一直在看vue的东西,现在就来慢慢介绍vux和vue这个骚东西的用法: 细看文档一步步来, npm install vux --save ...

  5. Java Servlet JSP编程(一)

    最近想学学java编程,java现在的应用还是挺广泛的,有必要学习一下. # index.jsp <%@ page language="java" contentType=& ...

  6. Java8(一)--lambda表达式

    相信作为一个Java程序员都会或多或少的了解过Java8中的lambda表达式.函数式编程等,本人也是用过lambda表达式,使用的都是比较简单 的实现 通过一个例子去都感受lambda: Compa ...

  7. 事件的节流(throttle)与防抖(debounce)

    事件的节流(throttle)与防抖(debounce) 有些浏览器事件可以在短时间内快速触发多次,比如调整窗口大小或向下滚动页面.例如,监听页面窗口滚动事件,并且用户持续快速地向下滚动页面,那么滚动 ...

  8. 使用SELECT语句检索数据

    使用SELECT语句检索数据select指令适用于SQL数据库SELECT 语句用于从数据库中选取数据.(指令不分大小写,选择的值除名字和一些有特殊意义的字符可不分大小写,from结束时一定要加;) ...

  9. 牛客多校Round 10

    咕咕咕.... 去烽火台和兵马俑了

  10. TWaver MONO Design中动画的导出与播放

    使用过MONO编辑器的朋友都应该了解MONO中支持一些动画的设置,比如开门,开窗,弹出设备,旋转场景,镜头巡航等.但如何将这些动画应用到自己的场景中呢?比如我们在编辑器中给机柜定义了动画,怎样让做好的 ...