[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 ...
随机推荐
- 算法习题---5.1大理石在哪(UVa10474)
一:题目 现有N个大理石,每个大理石上写了一个非负整数.首先把各数从小到大排序,然后回答Q个问题.每个问题问是否有一个大理石写着某个整数x,如果是,还要回答哪个大理石上写着x.排序后的大理石从左到右编 ...
- Python web-Http
web应用 Web应用程序一般指浏览器端/服务器端应用程序,这类应用程序一般借助谷歌,火狐等浏览器来运行.在网络编程的意义下,浏览器是一个socket客户端,服务器是一个socket服务端 impor ...
- js判断图片加载完成
<!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content=&quo ...
- Python3 IO编程之StringIO和BytesIO
StringIO 很多时候,数据读写不一定是文件,也可以在内存中读写. 要把str写入StringIO,我们需要先创建一个StringIO,然后像文件一样写入即可 >>> from ...
- 导入数据到数据库表,报错[Err] [Row1] [Imp] 1153 - Got a packet bigger than 'max_allowed_packet' bytes
# 在数据库新增查询,执行如下命令即可: show VARIABLES like '%max_allowed_packet%'; set global max_allowed_packet = 2*1 ...
- js 判断字符串是否为JSON格式
function isJSON(str) { if (typeof str == 'string') { try { var obj=JSON.parse(str); if(typeof obj == ...
- windows修改系统登录密码后,出现SQLserver服务无法启动,启动报错17051
windows修改系统登录密码后,出现SQLserver服务无法启动,启动报错17051具体报错如下: 根据错误提示,去到windows的事件查看器.在win10上,右击左下角的菜单图标:然后依次点击 ...
- 二、部署DHCP
*本文转自https://blog.51cto.com/lumay0526/2046957 简述 DHCP是Dynamic Host Configuration Protocol的缩写,中文称动态主机 ...
- [转帖]nginx基础整理
nginx基础整理 https://www.cnblogs.com/guigujun/p/6588545.html 目录结构如下: Nginx基础知识 Nginx HTTP服务器的特色及优点 Ngin ...
- linux服务器安装svn并上传项目
一.安装svn (1)安装svn服务器: yum install subversion (2)查看版本(随自己意愿): svnserve --version 二.创建svn仓库并配置 (1)创建svn ...