『力扣刷题本』:链表的回文结构

大家好呀,我是罗根。

大二上学期的课是真的多,最近也一直在学数据结构,忙的事情有点多,所以又拖更几个星期啦。不过这周是学校的素质教育周,一周都没上课,就参加各种活动,刷够 28 个学时就能拿到学分。

今天也是周五了,从昨天开始,我就一直在刷题,现在写完这篇文章,就要去出去玩了,希望本文对大家有所帮助~

一、题目

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

测试样例:

1->2->2->1
返回:true

二、思路解析

先说下元素个数为奇数的情况,分三步走:

第一步先找到中间位置,为了便于后半部分元素的翻转;

第二步,翻转后半部分;

第三步,前半部分跟后半部分同时遍历,比较值是否一致,一致即为回文结构。

而元素个数为偶数的情况呢,在上述第三步的时候,会出现不符合我们 if 语句要求的情况。具体请看下面代码:

while (head!=slow){
      if (head.val != slow.val){
          return  false;
         }

       head = head.next;
       slow = slow.next;

}

在偶数个数的情况下,相比于奇数情况,少了中间那个不相等的元素。

这就导致 head.val 跟 slow,val 是一样的,所以他们不会相遇,会一直 return false 。

那解决方法呢?

很简单,再加一个 if 语句进行判断即可,因为偶数情况的 head.next 刚好等于 slow ,具体请看下面代码:

while (head!=slow){
      if (head.val != slow.val){
          return  false;
         }

      if (head.next == slow){
           return true;
         }
    
       head = head.next;
       slow = slow.next;

}

三、完整代码

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 || head.next == null){
            return true;
        }

        ListNode fast = head;
        ListNode slow = head;

        while (fast != null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
        }

        ListNode cur = slow.next;
        while (cur!=null){
            ListNode curNext = cur.next;
            cur.next = slow;
            slow = cur;
            cur = curNext;
        }
        
        while (head!=slow){
            if (head.val != slow.val){
                return  false;
            }
            if (head.next == slow){
                return true;
            }
            head = head.next;
            slow = slow.next;
        }
        return true;

        }
    }

以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!

你可能感兴趣的:(力扣每日一题,leetcode,链表,算法,数据结构,java,intellij-idea,eclipse)