【数据结构】链表的回文结构

这篇具有很好参考价值的文章主要介绍了【数据结构】链表的回文结构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🌏引言

单链表的操作算法是笔试面试中较为常见的题目。
本文将着重介绍平时面试中常见的关于链表的应用题目,马上要进行秋招了。希望对你们有帮助 _😀
【数据结构】链表的回文结构,数据结构,数据结构,链表,回文结构,java

🧭链表的回文结构

【数据结构】链表的回文结构,数据结构,数据结构,链表,回文结构,java

🚩🚩题目描述:

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

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

import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class PalindromeList {
    public boolean chkPalindrome(ListNode A) {
         // write code here
    }
}

🚩🚩示例:

给定链表:11->22->33->22->11
返回值:true

🚩🚩思路解析:

回文字符串的中间节点两边的元素,如果从两头两中间进行比对的话,每一个里面的元素完全相同
【数据结构】链表的回文结构,数据结构,数据结构,链表,回文结构,java

🚩🚩🚩寻找中间节点

我们先寻找到中间节点,然后将中间节点后的链表部分进行局部偏转

寻找中间节点时用我们快慢指针的思想

fast:快指针,一次走两步
slow:慢指针,一次走一步
结束条件:
链表元素个数为偶数时:fast.next == null;
链表元素个数为奇数时:fast == null;
【数据结构】链表的回文结构,数据结构,数据结构,链表,回文结构,java

寻找中间节点代码如下

ListNode fast = A;
        ListNode slow = A;
        //找中间节点
        while(fast != null||fast.next != null) {
            //快指针,一次走两步
            fast = fast.next.next;
            //慢指针,一次走一步
            slow = slow.next;
        }

🚩🚩🚩局部翻转

接下来我们要对局部进行翻转

翻转单链表,我们首先设一个cur节点为我们当前所需要翻转的节点;还有一个curNext记录cur下一节点

翻转时:

  • 先用curNext记录cur下一节点的位置
  • 然后将cur.next置为slow,让cur节点指向slow
  • 再将cur节点设为slow
  • 最后让cur置为curNext,进行下一节点的翻转
    【数据结构】链表的回文结构,数据结构,数据结构,链表,回文结构,java
    结束条件:cur == null;

代码实现如下

  ListNode cur = slow.next;
        //局部翻转
        while( cur != null) {
            ListNode curNext = cur.next;
            cur.next = slow;
            slow = cur;
            cur = curNext;
        }

🚩🚩🚩判断是否回文

接下来我们就要判断是否回文

判断思想:

  • A节点与slow节点同时向中间节点进行遍历
  • 对比其中元素是否相等
  • 不相等返回false,相等则继续遍历,直到结束

结束条件:

  • 当链表中节点数为奇数时,这时候A与slow会相遇,指向同一位置
  • 所以条件为A == slow;
  • 【数据结构】链表的回文结构,数据结构,数据结构,链表,回文结构,java
  • 当链表中节点为偶数时,这时候A与slow是不会相遇的
  • 但是如果两边都遍历完,A的下一节点指向的肯定是slow
  • 所以条件为A.next == slow;
  • 【数据结构】链表的回文结构,数据结构,数据结构,链表,回文结构,java

代码实现如下:

//判断是否回文
        while(slow != A&& A.next != slow) {
            if(slow.val != A.val) {
                return false;
            }
            slow = slow.next;
            A = A.next;
        }
        return true;

🚩🚩完整代码与注意事项

🚩🚩🚩注意事项:

  • 结束条件不是循环的条件,不要搞混,不然进不去循环😭
  • 要注意对传进来的数据进行判断与筛选

🚩🚩🚩完整代码

import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class PalindromeList {
    public boolean chkPalindrome(ListNode A) {
        
        ListNode fast = A;
        ListNode slow = A;
        //找中间节点
        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(slow != A&& A.next != slow) {
            if(slow.val != A.val) {
                return false;
            }
            slow = slow.next;
            A = A.next;
        }
        return true;
    }
}

⭕总结

关于《【数据结构】链表的回文结构》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!文章来源地址https://www.toymoban.com/news/detail-661961.html

到了这里,关于【数据结构】链表的回文结构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 链表的回文结构

    对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针 A ,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。 测试样例: 1-2-2-1 返回:true 题目链接:链表的回文结构_牛客题霸_牛客网 

    2024年02月06日
    浏览(36)
  • 【nowcoder】链表的回文结构

    牛客题目链接 链表的回文结构

    2024年01月24日
    浏览(29)
  • 【链表OJ题 6】链表的回文结构

    目录 题目来源: 代码实现: 思路分析: 实现过程: 链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 题目描述: 本题的难点在于时间复杂度为O(n),空间复杂度为O(1)。 因为回文结构是正着读反着读是一样的,因此我们 找到链表的中间结点,然后从中间节点开始逆置到尾结点,

    2024年02月06日
    浏览(26)
  • LeetCode_链表的回文结构

    ✨✨所属专栏:LeetCode刷题专栏✨✨ ✨✨作者主页:嶔某✨✨ 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。 就比如:1-2-3

    2024年04月26日
    浏览(30)
  • 链表分割,链表的回文结构等经典例题解析!

    链接: 链表分割_牛客题霸_牛客网 (nowcoder.com) https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70?tpId=8tqId=11004rp=2ru=/activity/ojqru=/ta/cracking-the-coding-interview/question-ranking public class Partition {     public ListNode partition(ListNode pHead, int x) {         ListNode cur = pHead;         ListNode bs =

    2024年02月19日
    浏览(37)
  • 【数据结构】链表的分类和双向链表

    本篇是基于上篇单链表所作,推荐与上篇配合阅读,效果更加 http://t.csdnimg.cn/UhXEj 链表的结构非常多样,以下情况组合起来就有8种(2 x 2 x 2)链表结构: 我们一般叫这个头为哨兵位 我们上回讲的单链表就是不带头单项不循环链表。 今天我们要讲带头双向循环的链表。 不过

    2024年01月25日
    浏览(27)
  • 数据结构-二叉链表的结构与实现

    目录 一、引言 二、什么是二叉链表 三、二叉链表的结构 四、二叉链表的实现 1. 创建二叉链表 2. 遍历二叉链表 3. 插入节点 4. 删除节点 五、应用场景 六、总结 七、代码示例 数据结构是计算机科学中的重要概念,它是计算机程序设计的基础。二叉链表是一种常见的数据结构

    2024年02月08日
    浏览(34)
  • 数据结构----链表介绍、模拟实现链表、链表的使用

    ArrayList底层使用连续的空间,任意位置插入或删除元素时,需要将该位置后序元素整体往前或者往后搬移,故时间复杂度为O(N) 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后

    2024年02月21日
    浏览(35)
  • 【Leetcode】反转链表 合并链表 相交链表 链表的回文结构

      目录 一.【Leetcode206】反转链表 1.链接 2.题目再现  3.解法A:三指针法 二.【Leetcode21】合并两个有序链表 1.链接 2.题目再现  3.三指针尾插法 三.【Leetcode160】相交链表 1.链接 2.题目再现 3.解法 四.链表的回文结构 1.链接 2.题目再现  3.解法 1.链接 反转链表 2.题目再现  3.解法

    2024年02月02日
    浏览(34)
  • 【数据结构】双向链表的实现

    我要扼住命运的咽喉,他却不能使我完全屈服。                      --贝多芬 目录 一.带头循环的双向链表的特点 二.不带头不循环单向链表和带头循环的双向链表的对比 三.初始化链表,创建哨兵结点 四.双向链表的各种功能的实现 1.双向链表的尾插 2.双向链表的打印 

    2023年04月10日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包