题目描述:

请判断一个链表是否为回文链表。

示例 1:

输入: 1->2
输出: false
示例 2: 输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

思路分析:

思路一:借助辅助栈和辅助队列,链表节点依次入队列和入栈,依次出栈和出队,判断是否相等即可

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public static boolean isPalindrome(ListNode head) { //借助一个栈和一个队列去判断
Deque<ListNode> deque = new LinkedList<>();
Stack<ListNode> helper = new Stack<>();
int count = 0;
while (head != null) {
deque.addLast(head);
helper.push(head);
head = head.next;
count++;
}
for (int i = 0; i < count; i++) {
if (deque.poll().val != helper.pop().val) {
return false;
}
} return true;
}
}

时间复杂度:O(n)

空间复杂度:O(2n)->O(n)

思路二:快慢指针

思想很简单,用2个指针,一个low,一个fast,fast是low的2倍,所以可以达到2分链表的效果,在移动指针时同时对前半部分链表进行反转。最后直接比较被分开的2个链表。因为不能改变当前slow的next,不然就无法跳到下一个元素,所以这里用pre和prepre实现指针的反转

代码实现:

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
//快慢指针:边遍历边翻转前半段
public static boolean isPalindrome(ListNode head) { if (head == null || head.next == null) {
return true;
}
ListNode slow = head;
ListNode fast = head.next;
ListNode preNode = null;
ListNode pre2Node = null;
while (fast != null && fast.next != null) { preNode = slow;
//此处因为不能丢失slow.next,所以使用preNode和pre2Node实现链表的翻转
slow = slow.next;
fast = fast.next.next;
preNode.next = pre2Node;
pre2Node = preNode;
}
//链表被分成两个部分,qNode表示后链表的头
ListNode qNode = slow.next;
//注意,因为之前没有指定slow.next指向哪个节点,此处要做指定(之前为了持续遍历,slow.next一直指向原链表的下一个节点)
slow.next = preNode;
//考虑奇偶:如果链表节点个数为偶数,则前链表的表头为slow,否则为slow.next
ListNode pNode = fast == null ? slow.next : slow;
while (qNode != null && pNode != null) {
if (qNode.val != pNode.val) {
return false;
}
qNode = qNode.next;
pNode = pNode.next;
}
return true;
}
}

时间复杂度:O(n)

空间复杂度:O(1)

最新文章

  1. 【WP 8.1开发】How to 图像处理
  2. 一个简单的游戏开发框架(六.行为Action)
  3. x5设置经典门户登录
  4. Android AIDL Service
  5. 旋转转盘选择Menu--第三方开源--CircleMenu
  6. OGG-00782 - OGG 11.2.1.0.2 FOR Windows x64 Microsoft SQL Server
  7. learning nodejs 2 - connect middleware
  8. sql 更新一列为行号
  9. jQuery on()方法绑定动态元素的点击事件无效
  10. Unity3D Android手机开发环境配置
  11. Mycat 分片规则详解--取模分片
  12. 互相关(cross-correlation)及其在Python中的实现
  13. 【Unix网络编程】chapter8基本UDP套接字编程
  14. Field &#39;email&#39; doesn&#39;t have a default value
  15. linux用户态定时器的使用---19
  16. TP框架控制器的空操作
  17. oracle用户 密码永不过期
  18. Druid学习之路 (三)Druid的数据源和段
  19. 文件 I/O字符流
  20. P2903 [USACO08MAR]麻烦的干草打包机The Loathesome Hay Baler

热门文章

  1. luogu题解 P4092 【[HEOI2016/TJOI2016]树】树链剖分
  2. JS ES6
  3. @media screen媒体查询实现页面自适应布局
  4. django 文件上传样例以及遇到的一些问题
  5. 微信小程序双向绑定
  6. golang 中Pointers Vs References
  7. 【pip】使用
  8. 如何使用NugetPackageExplorer 创建Nuget发布包,简易版
  9. Linux文件系统之复制文件cp(文件复制)
  10. 01 salt平台,软件架构图