首页 > 其他分享 >只用单链表的方式判断一个链表是否为回文链表

只用单链表的方式判断一个链表是否为回文链表

时间:2024-09-25 18:24:25浏览次数:9  
标签:head 单链 None next 链表 half first 回文

思路

  • 寻找链表的中点:使用快慢指针的方法,快指针每次移动两步,慢指针每次移动一步。当快指针到达链表末尾时,慢指针正好位于链表的中间。

  • 反转后半部分链表:从中点开始反转链表的后半部分。

  • 比较前半部分和反转后的后半部分:逐一比较两个部分的节点值,如果所有对应的节点值都相同,则链表是回文的。

  • (可选)恢复链表的原始结构:将反转的后半部分再反转回来,以恢复原链表结构。

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def isPalindrome(head: ListNode) -> bool:
    if head is None or head.next is None:
        return True

    # Step 1: Find the end of the first half
    first_half_end = end_of_first_half(head)
    
    # Step 2: Reverse the second half
    second_half_start = reverse_list(first_half_end.next)
    
    # Step 3: Compare the first half and the reversed second half
    p1 = head
    p2 = second_half_start
    result = True
    while result and p2 is not None:
        if p1.val != p2.val:
            result = False
        p1 = p1.next
        p2 = p2.next
    
    # Step 4: Restore the list (optional)
    first_half_end.next = reverse_list(second_half_start)
    
    return result

def end_of_first_half(head: ListNode) -> ListNode:
    fast = head
    slow = head
    # Move fast by 2 steps and slow by 1 step until fast reaches the end
    while fast.next is not None and fast.next.next is not None:
        fast = fast.next.next
        slow = slow.next
    return slow

def reverse_list(head: ListNode) -> ListNode:
    previous = None
    current = head
    while current is not None:
        next_node = current.next
        current.next = previous
        previous = current
        current = next_node
    return previous

 

标签:head,单链,None,next,链表,half,first,回文
From: https://www.cnblogs.com/zx618/p/18431931

相关文章

  • 数据结构:双向链表(Doubly Linked List篇)手把手带你入门数据结构~
    文章目录前言一、双向链表的概念1.结构特点:2.优点:二、双向链表的实现1.双向链表的结构2.双向链表初始化3.双向链表销毁4.双向链表打印5.双向链表尾插6.双向链表头插7.双向链表尾删8.双向链表头删9.双向链表查找10.双向链表指定位置插入11.双向链表指定位置......
  • 【链表操作】前驱和后继
    题目描述设计函数void prevnext(structnode*head,charx);,在以head为头指针的非空链表中,找到数据域值为x的结点,输出该结点的前一个结点和后一个结点的数据域值,如果该结点没有前驱结点(即该结点为第1个结点),则以-1代替,如果该结点没有后继结点(即该结点为尾结点),也以-1代替......
  • Day5 JavaWeb知识了解以及每日一题:力扣125.验证回文串
    Day5JavaWeb知识了解以及每日一题:力扣125.验证回文串2024年9月24日20:06:45JavaWeb基础知识TomcatApacheTomcat是一个开源的Servlet容器和Web服务器,它是JavaEE(EnterpriseEdition)的一部分,专门用于运行JavaServlet和JavaServerPages(JSP)。Tomcat的主要功能是接收HTTP......
  • 简单易懂理解:数仓——拉链表
    1.什么是拉链表拉链表就像衣服的拉链一样重要,实用性非常强,使用频率非常高。所谓的拉链,就是历史记录,记录一个事物的开始到结束所变化的所有信息。“拉链表是一种针对数据仓库设计中表存储数据的方式而定义的数据模型,它有点类似于快照,‌它通过记录每个数据项的生效日期和失效......
  • 链表的回文结构
    对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。测试样例:1->2->2->1返回:true什么是回文?:回文是指从前向后读和从后向前读都相同的字符......
  • 数据结构:单链表
    单链表单链表概念与结构节点链表的性质单链表的打印实现单链表创建新的节点在末尾插入数据在头部插入数据删除尾部数据删除第一个节点在链表中寻找目标数据在指定位置之前插入数据在指定位置之后插⼊数据删除pos结点删除pos之后的结点销毁链表单链表测试单链表概念与......
  • 基础数据结构之链表
    链表1)概述定义在计算机科学中,链表是数据元素的线性集合,其每个元素都指向下一个元素,元素存储上并不连续Incomputerscience,alinkedlistisalinearcollectionofdataelementswhoseorderisnotgivenbytheirphysicalplacementinmemory.Instead,eachelem......
  • 数据结构-线性表的单链式存储结构图解及C语言实现
    概念链式存储:结点在存储器中的位置是任意的,即逻辑相邻的数据元素在物理上不一定相邻链式存储结构也称非顺序映像或链式映像图解链式存储结构中结点一般有两个部分组成,即数据域(data)和指针域,数据域是用于存放数据的,指针域是用来指向下一结点的地址的,其中头节点指向该链表......
  • 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......