链表刷题

52 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情

文章目录

在线Oj链接

1. 题目描述

2. 解题思路

3. 题解

在线Oj链接

OR36 链表的回文结构

1. 题目描述

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

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

测试样例:​编辑

2. 解题思路

先用快慢指针找到链表的中间节点

再将中间节点后部分的链表反转

然后从链表两头开始比较元素的大小

​编辑

对上面这个链表,我们先定义一个快慢指针,fast和slow,让fast走两步,slow走一步,当fast=null或者fast.next=null时,说明slow为中间节点,如下图;

​编辑

找到中间节点后,我们进行中间节点后的链表反转

定义一个cur记录待反转链表头节点,curNext记录cur,反转后结果如下:​编辑

此时只需要从两端开始比较对应位置值的大小就可以了

3. 题解

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来解决

“ 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!