[LeetCode] 234. 回文链表 ☆(翻转链表)
描述
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
解析
回文的意思,比如 1->2->2->1是回文链表;1->2->3->2->1也是。要满足上面的时间、空间复杂度,需要翻转前半部分的链表,与后半部分的链表比较。
步骤:
1. 找出中间节点;
2.翻转前半部分节点;
3.与后半部分节点一一比较。
优化点:
将步骤1、2合并,边找中间节点边翻转。
代码
例子:
1 2 3 4
slow = 2 fast = 3
slow = 3 fast = null pre=2
1 2 3 4 5
slow = 2 fast = 3
slow = 3 fast = 5 pre=2
/**
* 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;
}
ListNode last = null;
ListNode pre = head;
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
pre = slow;
slow = slow.next;
fast = fast.next.next; pre.next = last;
last = pre;
} ListNode rightStart;
if (fast == null) {//说明偶数节点
rightStart = slow;
} else {
rightStart = slow.next;
} ListNode leftStart = pre;
while (leftStart != null && rightStart != null) {
if (leftStart.val != rightStart.val) {
return false;
}
leftStart = leftStart.next;
rightStart = rightStart.next;
}
if (leftStart != null || rightStart != null) {
return false;
}
return true;
}
//正常思路,一步一步来
public boolean isPalindrome1(ListNode head) {
if (head == null || head.next == null) {
return true;
}
ListNode pre = head;
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {//找中间节点
pre = slow;
slow = slow.next;
fast = fast.next.next;
}
pre.next = null;
ListNode rightStart;
if (fast == null) {//说明偶数节点
rightStart = slow;
} else {
rightStart = slow.next;
} ListNode leftStart = reserver(head);//翻转前半部分链表
while (leftStart != null && rightStart != null) {//一一比较
if (leftStart.val != rightStart.val) {
return false;
}
leftStart = leftStart.next;
rightStart = rightStart.next;
}
if (leftStart != null || rightStart != null) {
return false;
}
return true;
}
//翻转链表
public ListNode reserver(ListNode head) {
if (head == null) {
return head;
}
ListNode pre = null;
ListNode cur = head;
ListNode next;
while (cur != null) {
next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
}
[LeetCode] 234. 回文链表 ☆(翻转链表)的更多相关文章
- Java实现 LeetCode 234 回文链表
234. 回文链表 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否 ...
- Leetcode 234. 回文链表(进阶)
1.题目描述 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O ...
- leetcode 234 回文链表 Palindrome Linked List
要求用O(n)时间,和O(1)空间,因此思路是用本身链表进行判断,既然考虑回文,本方法思想是先遍历一次求链表长度,然后翻转前半部分链表:然后同时对前半部分链表和后半部分链表遍历,来判断对应节点的值是否 ...
- LeetCode 234——回文链表
1. 题目 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O( ...
- LeetCode 234. 回文链表
class Solution { public: bool isPalindrome(ListNode* head) { deque<int> d1, d2; ListNode* p = ...
- Leetcode:234 回文链表
leetcode:234 回文链表 关键点:请判断一个链表是否为回文链表.示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true. ...
- [链表]LeetCode 25 K组一个翻转链表
LeetCode 25 k组一个翻转链表 TITLE 示例 1: 输入:head = [1,2,3,4,5], k = 2 输出:[2,1,4,3,5] 示例 2: 输入:head = [1,2,3, ...
- leetcode 1.回文数-(easy)
2019.7.11leetcode刷题 难度 easy 题目名称 回文数 题目摘要 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 思路 一些一定不为回文数的 ...
- LeetCode: Palindrome 回文相关题目
LeetCode: Palindrome 回文相关题目汇总 LeetCode: Palindrome Partitioning 解题报告 LeetCode: Palindrome Partitioni ...
随机推荐
- 【Git】 Git安装及配置
Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理.而国外的GitHub和国内的Coding都是项目的托管平台. 本例使用环境:Linux环境(CentOS 7.4 ...
- python flask框架学习(二)——第一个flask程序
第一个flask程序 学习自:知了课堂Python Flask框架——全栈开发 1.用pycharm新建一个flask项目 2.运行程序 from flask import Flask # 创建一个F ...
- LeetCode_342. Power of Four
342. Power of Four Easy Given an integer (signed 32 bits), write a function to check whether it is a ...
- GNU C之__attribute__
__attribute__可以设置函数属性(Function Attribute).变量属性(Variable Attribute)和类型属性(Type Attribute) __attribute_ ...
- Linux使用sleep进行延迟实验
sleep命令可以延迟脚本执行一段时间(以秒为单位).下面的命令使用tput和sleep从0开始计时到40秒: #/bin/bash echo Count: tput sc # 循环40s for c ...
- Js把对象数组列表转换成数组
今天写组件的时候遇到一个问题,就是当我需要对获取到的对象列表进行删减的时候,发现没有合适的方法,比如: //获取图片列表 var imgs = document.getElementsByTagNam ...
- Flutter 路由传入中文参数报错无法push问题
flutter自带路由传递参数和使用第三方库fluro路由传递参数都可以通过一下方式解决问题 String jsonString = json.encode(mapValue); var jsons ...
- 关于Form、ModelForm的一些操作(持续更新)
1.前端循环:后端传到前端的form是可以循环的,以此获得想要展示的元素 <form method="post" class="form-horizontal&qu ...
- PHP mbstring通过多字节字符串扩展处理中文查找、计算问题
最近有个需求有到了mbstring相关的函数进行中文处理,如下: mb_strpos mb_strlen 过程中遇到一点比较奇怪的问题,及在本地环境运行没有问题 但我们生产环境是2台服务器,其中一台正 ...
- 洛谷 题解 P1041 【传染病控制】
[思路] 题目给出一棵树.第\(i\)步拆的一定是第\(i\)层与第\(i+1\)层之间的连边,否则不是最优(自行证明即可),所以可以暴力枚举每一次拆哪一个节点与上一个节点的连边. 把所有节点所在的层 ...