美文网首页
单向链表-对称链表

单向链表-对称链表

作者: 今年花开正美 | 来源:发表于2020-05-27 23:37 被阅读0次

今天学习的算法是对称链表,今天这题真是有点跳转,反复提交了三次才通过。第一次错了后想了半小时实在没头绪,就看了下提示,发现需要用到之前做过的快慢指针和链表反转结合起来,这才恍然大悟。

题目介绍

对称链表就是给定一个单向链表,判断是不是对称的。我们用张图来表示下吧:


对称链表题目.png

实现思路

老规矩,先看解题思路图。


对称链表-解题.png
难点说明

首先将整个过程分为两大步:前半链表反转和前后链表比较。

1.前半链表反转,链表反转使用的技巧是之前实现过的:每次移动一位指针,然后把指向的节点交换到head位置。而为了让反转不超过中间节点,就需要使用到快慢指针(快的每次移动两步,这样只要快指针到了最后时就说明慢指针已经到中间位置了)。

2.前后链表比较:当快指针到了尾部后,这时前半段链表已经反转了,而且慢指针也到了中间位置。之后就只要继续移动慢指针,同时从head开始移动,比较慢指针和head指针的值是一样即可。

重点关注下边界情况,仔细分析

  • 快指针指向节点不为null表示链表的长度为奇数,慢指针需要往后移动一位。
  • 快指针指向节点为null表示链表的长度为偶数,慢指针不需移动。

实现代码

public boolean isPalindrome(ListNode head) {
    if (null == head || null == head.next) {
        return true;
    }
    //两个节点直接检查
    if (null == head.next.next) {
        return head.val == head.next.val;
    }

    ListNode quickNode = head.next.next;
    ListNode slowNode = head.next;
    ListNode slowPreNode = head;
    boolean isComparing = false;
    while (null != slowNode) {
        if(null != quickNode && null != quickNode.next){
        quickNode = quickNode.next.next;

        //链表反转
        slowPreNode.next = slowNode.next;
        slowNode.next = head;
        head = slowNode;
        slowNode = slowPreNode.next;
        }else{
        //首次交换
        if(!isComparing){
            //节点个数为奇数
            if (null != quickNode) {
            slowNode = slowNode.next;
            }
            isComparing = true;
        }

        if (head.val != slowNode.val) {
            return false;
        }
        head = head.next;
        slowNode = slowNode.next;
        }
    }
    return true;
}

感觉代码实现稍显复杂,后续去找找标准答案。

相关文章

  • 单向链表-对称链表

    今天学习的算法是对称链表,今天这题真是有点跳转,反复提交了三次才通过。第一次错了后想了半小时实在没头绪,就看了下提...

  • 8.单向链表SingleLinkList

    目录:1.单向链表的定义2.单向链表的图解3.单向链表定义操作4.单向链表的实现 1.单向链表的定义 2.单向链表...

  • 2019-12-04 Java-LinkedList源码解读

    @TOC 1、链表数据结构 链表分为单向链表和双向链表,他们的区别在于,单向链表只能单向寻址,而双向链表可以双向寻...

  • 10.单向循环链表SingleCycleLinkList

    目录:1.单向循环链表的定义2.单向循环链表的图解3.单向循环链表定义操作4.单向循环链表的实现 1.单向循环链表...

  • 数据结构与算法——线性表3

    线性表——单向循环链表 3、单向循环链表 在单向链表的基础上,单向链表的尾结点的Next指向链表的头部,就是为循环...

  • 数据结构基础--单向循环链表

    单向循环链表 单向循环链表是可循环的单链表,它与单链表的区别在于单向链表的最后一个元素的指针域为空,而单向循环链表...

  • 线性表-单向循环链表

    为了方便,本文介绍的单向循环链表不包含头节点 单向循环链表内容 单向循环链表的的定义 单向循环链表的创建 单向循环...

  • 数据结构与算法之循环链表(3.4)

    目录 单向循环链表双向循环链表约瑟夫问题如何发挥循环链表的最大威力? 一 单向循环链表 单向循环链表 - 只有一个...

  • 04单向循环链表实现总结

    一、说说什么是单向循环链表? 人狠话不多. 上图. 单向循环链表就是这个样子!单向循环链表.png 与单向链表区别...

  • 算法与数据结构:链表

    链表 链表还分为单向链表和双向链表, 但是这篇文章只说单向链表 , 下次再讲双向链表 . 链表和数组的区别 ? 链...

网友评论

      本文标题:单向链表-对称链表

      本文链接:https://www.haomeiwen.com/subject/fkenahtx.html