赞
踩
作者:敲代码の流川枫
博客主页:流川枫的博客
专栏:和我一起学java
语录:Stay hungry stay foolish
给大家推荐一款好用的神器
Apifox = Postman + Swagger + Mock + JMeter。集接口文档工具、接口Mock工具、接口自动化测试工具、接口调试工具于一体,提升 10 倍研发效率戳我来体验~
文章目录
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
测试样例:
先用快慢指针找到链表的中间节点
再将中间节点后部分的链表反转
然后从链表两头开始比较元素的大小
对上面这个链表,我们先定义一个快慢指针,fast和slow,让fast走两步,slow走一步,当fast=null或者fast.next=null时,说明slow为中间节点,如下图;
找到中间节点后,我们进行中间节点后的链表反转
定义一个cur记录待反转链表头节点,curNext记录cur,反转后结果如下:
此时只需要从两端开始比较对应位置值的大小就可以了
- import java.util.*;
-
-
- public class ListNode {
- int val;
- ListNode next = null;
-
- ListNode(int val) {
- this.val = val;
- }
- }
- public class PalindromeList {
- public boolean chkPalindrome(ListNode head) {
- // write code here
- if(head == null){
- return false;
- }
- if(head.next == null){
- return true;
- }
- //找中间点
- ListNode fast = head;
- ListNode slow = head;
- while(fast!=null&&fast.next!=null){
- fast = fast.next.next;
- slow = slow.next;
- }
- //2.反转
- ListNode cur = slow.next;
- while(cur!=null){
- ListNode curNext = cur.next;
- cur.next = slow;
- slow = cur;
- cur = curNext;
- }
- //3.比较大小
- while(head!=slow){
- if(head.val!=slow.val){
- return false;
- }
- //链表长度为偶数情况
- if(head.next == slow){
- return true;
- }
- head = head.next;
- slow = slow.next;
- }
- return true;
- }
- }
在比较大小的时候要注意是偶数的情况,用head.next == slow来解决
“ 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。