首页 > 其他分享 >【回文链表】快慢指针+反转链表

【回文链表】快慢指针+反转链表

时间:2023-12-14 11:25:55浏览次数:27  
标签:head ListNode val next 链表 rHead 回文 指针

leetcode 234. 回文链表

题意:判断一个链表是不是回文(中心对称)的

【反转链表】题解1:

得到原链表的反转链表,然后对比原链表与反转链表的内容是否一致即可。

反转链表版本代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
        ListNode rHead = reverse(head);
        while(head != null) {
            if(head.val != rHead.val) {
                return false;
            }
            head = head.next;
            rHead = rHead.next;
        }
        return true;
    }

    public ListNode reverse(ListNode head) {
        return reverse(head, null);
    }

    public ListNode reverse(ListNode head, ListNode rLastHead) {
        if(head == null) return null;
        ListNode rHead = new ListNode(head.val, rLastHead);
        if(head.next == null) return rHead;
        return reverse(head.next, rHead);
    }
}

【快慢指针+反转链表】题解2:

  1. 将链表一分为二,保证第一段子链表节点个数不小于第二段
    通过快慢指针得到第二段子链表表头(先得到第一段子链表表尾,然后next得到第二段子链表表头)
    快指针:每次移动两步
    慢指针:每次移动一步
  2. 对第二段子链表进行反转
  3. 遍历第二段子链表,看其是否与第一段子链表val相同

快慢指针+反转链表版本代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
        ListNode fast = head;
        ListNode low = head;
        while(fast.next != null && fast.next.next != null) {
            low = low.next;
            fast = fast.next.next;
        }
        low = low.next;
        ListNode rHead = reverse(low);
        while(rHead != null) {
            if(head.val != rHead.val) return false;
            head = head.next;
            rHead = rHead.next;
        }
        return true;
    }

    public ListNode reverse(ListNode head) {
        return reverse(head, null);
    }

    public ListNode reverse(ListNode head, ListNode rLastHead) {
        if(head == null) return null;
        ListNode rHead = new ListNode(head.val, rLastHead);
        if(head.next == null) return rHead;
        return reverse(head.next, rHead);
    }
}

标签:head,ListNode,val,next,链表,rHead,回文,指针
From: https://www.cnblogs.com/Eve7Xu/p/17900778.html

相关文章

  • C++基础 -6- 二维数组,数组指针
    ———————二维数组,数组指针——————— ......
  • 【反转链表】while循环/递归
    leetcode206.反转链表题意:给定链表表头,反转链表,返回反转链表的表头【循环】题解:head维护原链表当前节点,nHead维护反转链表的头节点,nHead置于head前一位,依次后移,直至head到链表尾结束。双指针循环版本/***Definitionforsingly-linkedlist.*publicclassListNode......
  • 数据结构:双链表
    由于双链表中大部分操作其实和单链表操作类似,所以这里只挑关键的一些函数1、定义与初始化typedefstructDNode{ElementTypedata;structDNode*prior,*next;}DNode,*DLinkList;boolInitialDLinkList(DLinkList&L){L=(DNode*)malloc(sizeof(DNode));......
  • 【交叉链表】Java哈希表——HashSet类/双指针
    leetcode160.相交链表题意:给定两个链表A、B的表头节点,找到链表交叉节点(地址值相同)。链表A长度为m,链表B长度为n,范围在[1,3e4]题解1:根据哈希表去重的原理,使用哈希表集合HashSet来维护链表节点,默认比较节点地址值。将链表A中的节点全部add进HashSet中,然后遍历链表B中的节点,如果......
  • 2023/12/10 链表
    #include<iostream>usingnamespacestd;typedefintElemType;//自定义链表数据元素为整数structLNode{ElemTypedata;LNode*next;};//初始化链表,返回值:失败返回nullptr,成功返回头结点地址LNode*InitList(){LNode*head=newLNode;//分配头结点......
  • 基于DAMON的LRU链表排序 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/admin-guide/mm/damon/lru_sort.htmlDAMON-basedLRU-listsSortingDAMON-basedLRU-listsSorting(DAMON_LRU_SORT)是一个静态内核模块,旨在用于基于主动和轻量级数据访问模式的(去)优先级排序,以使LRU列表成为更可信赖的数据访问模式源......
  • 关于雷电9模拟器开启指针位置不显示坐标问题的解决方案
    点击设置,进入关于手机页面,点击手机版本号,点击多次进入开发者模式进入输入模块,开启指针位置,如坐标未显示,则进入模拟器的安装目录,找到vms文件夹,进入并新建一个名称为debug的txt文本进行保存  重新启动模拟器即可......
  • [LeetCode] LeetCode92. 反转链表II
    题目描述思路:同LeetCode25.K个一组翻转链表因为涉及到可能链表的头节点会改变,所以设置dummy节点先走left-1步到达left的左边一个节点查看后面是否存在right-left+1个节点先翻转内部节点指向right-left次再翻转外部节点方法一:/***Definitionforsingly-lin......
  • [刷题技巧] 链表刷题技巧汇总
    链表的算法题中很常见的技巧:添加虚拟头结点,即dummy结点。当需要创造一条新链表的时候,可以使用虚拟头节点简化边界情况的处理。例如:LeetCode21.合并两个有序链表,让两条有序链表合并成一条新的有序链表,需要创造一条新的链表。例如,LeetCode86.分隔链表,把一条链表分解成两条链......
  • 如何判断链表是否存在环?
    大家好,今天我们来聊一聊如何判断链表是否存在环。如果你是一个链表的小白,听到“环”这个词可能会感到一头雾水。别担心,我会用通俗易懂的语言来解释这个问题,并带大家看一段代码演示。首先,我们要了解什么是链表。链表是一种数据结构,由一系列节点组成,每个节点都有一个值和一个指向下一......