首页 > 其他分享 >链表的回文结构

链表的回文结构

时间:2024-09-24 13:20:27浏览次数:3  
标签:head slow cur 回文结构 fast next 链表 节点

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

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

测试样例:

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

什么是回文?:回文是指从前向后读和从后向前读都相同的字符串或数字。例如,“abcba”或数字“121”都是回文。

解决思路:

回文结构,从前向后与从后往前读的值都一样,故我们可以让head和一个尾部元素向中间遍历,遍历期间的值都相等,直到两者相遇,返回true(是回文结构)

1.找到中间节点:

1.通过快慢指针定位中间节点slow:

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

2.反转后半节点,从而让尾部元素从后往前遍历:

定义一个节点cur = slow.next;

同时定义一个节点curN来保存cur的下一个节点:

curN = cur.next;(用于下一个节点的反转)

通过cur.next = slow来实现当前节点的反转

slow = cur,更新slow,进入下一个节点

curN = cur; 更新cur节点

直到最后,cur == null,反转成功,此时

3.判断是否为回文结构:

通过while循环(head!=slow)让head节点与slow节点从后往前遍历,如果符合回文节点,遍历过程中  head.val == slow.val;  当遍历到中间时,head == slow 返回true,当然,这种只适合奇数个数的。

换成偶数的,便不能遍历到中间了,此时head.val != slow.val.

怎么解决?

 每次遍历时,判断 head.next == slow,如果这个结果成立,则返回true,是回文列表.

 具体代码如下:

public boolean chkPalindrome(ListNode head) {
        // write code here
        if(head ==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 curN = cur.next;
        cur.next = slow;
        slow = cur;
        cur = curN;
        }
        //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,slow,cur,回文结构,fast,next,链表,节点
From: https://blog.csdn.net/kkksij/article/details/142486505

相关文章

  • 数据结构:单链表
    单链表单链表概念与结构节点链表的性质单链表的打印实现单链表创建新的节点在末尾插入数据在头部插入数据删除尾部数据删除第一个节点在链表中寻找目标数据在指定位置之前插入数据在指定位置之后插⼊数据删除pos结点删除pos之后的结点销毁链表单链表测试单链表概念与......
  • 基础数据结构之链表
    链表1)概述定义在计算机科学中,链表是数据元素的线性集合,其每个元素都指向下一个元素,元素存储上并不连续Incomputerscience,alinkedlistisalinearcollectionofdataelementswhoseorderisnotgivenbytheirphysicalplacementinmemory.Instead,eachelem......
  • c++实现链表单双环链表
    数据结构链表1.链表实质上是一个结构体,包含数据域和指针域,这两个实际上都是一个变量而已,只不过数据域存放的是节点的数据,指针域存放的是下一个节点的地址2.我们新建一个链表节点的时候通常采取的语句类似于NumList*head=(NumList*)malloc(sizeof(NumList)),要注意,......
  • leecode203-移除链表元素
    文章目录题目解题方法1题目给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例1:输入:head=[1,2,6,3,4,5,6],val=6输出:[1,2,3,4,5]示例2:输入:head=[],val=1输出:[]示例3:输入:head......
  • 【PAT_Python解】1025 反转链表
    原题链接:PTA|程序设计类实验辅助教学平台参考资料:1025反转链表(25分)PAT乙级C++/Python版_1025反转链表分数25作者chen,yue单位浙江大学给定一个常数k以及一个-CSDN博客【Python数据结构】反转链表的方法_反转链表python-CSDN博客Python基础算法——反......
  • 数据结构与算法——Java实现 12.习题——合并有序链表
    目录21.合并两个有序链表方法1递归思路方法2迭代思路 完整代码结点类方法 人各有所感,角度不同又怎能感同身受                                                ——24.9.2321.合并两个有序链表将两个......
  • DS循环链表—约瑟夫环
    题目描述N个人坐成一个圆环(编号为1-N),从第S个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。例如:N=3,K=2,S=1。2号先出列,然后是1号,最后剩下的是3号。要求使用循环链表实现。输入测试数据有多组每组包括3个数N、K、S,表示有N个人,从第S个......
  • [Python手撕]判断回文链表
    #Definitionforsingly-linkedlist.#classListNode:#def__init__(self,val=0,next=None):#self.val=val#self.next=nextclassSolution:defisPalindrome(self,head:Optional[ListNode])->bool:deffindmid(he......
  • 链表-栈例题
    MT2135调整队伍马蹄集:链表小码哥迎来了他大学的第一次军训,军训的第一个项目就是列队,每个同学在队伍中都有属于自己的编号。但在练习过程中,教官怎么看这支队伍怎么不顺眼,于是决定调整一下队伍的顺序。为了顺便考验同学们的反应力,教官与学生们约定了一个口令,每当他说xy0,x号同学......
  • Java集合类面试题:Map接口(链表、HashMap、红黑树)
    收集大量Java经典面试题目......