首页 > 其他分享 >【LBLD】如何判断回文链表

【LBLD】如何判断回文链表

时间:2023-03-31 09:33:58浏览次数:47  
标签:head ListNode val nullptr next 链表 LBLD left 回文

【LBLD】如何判断回文链表

判断回文单链表

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode *left;

    bool isPalindrome(ListNode* head) {
        left = head;
        return traverse(head);
    }

    bool traverse(ListNode* head) {
        if (head == nullptr) return true;
        bool res = traverse(head->next);
        res = res && (left->val == head->val);
        left = left->next;
        return res;
    }
};

优化空间复杂度

使用快慢指针找到链表中点,然后把链表后半段反转,双指针判断两个链表是否相同。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    bool isPalindrome(ListNode* head) {
        // 使用快慢指针找到中点
        ListNode *slow = head, *fast = head;
        while (nullptr != fast && nullptr != fast->next) {
            fast = fast->next->next;
            slow = slow->next;
        }
        if (nullptr != fast) {
            slow = slow->next;
        }

        ListNode *left = head;
        ListNode *right = reverse(slow);
        while (nullptr != right) {
            if (right->val != left->val) return false;
            left = left->next;
            right = right->next;
        }
        return true;
    }

    ListNode* reverse(ListNode* head) {
        ListNode *pre = nullptr;
        ListNode *cur = head;
        ListNode *nxt = head;

        while (cur) {
            nxt = cur->next;
            cur->next = pre;
            pre = cur;
            cur = nxt;
        }
        return pre;
    }
};

标签:head,ListNode,val,nullptr,next,链表,LBLD,left,回文
From: https://www.cnblogs.com/yangxuanzhi/p/17275188.html

相关文章

  • Leetcode19. 删除链表的倒数第 N 个结点
     19. 删除链表的倒数第N个结点自己纯手写第一题,递归有点冗杂,开辟了虚拟头节点,而且要特别注意边界条件(当倒数第n个正好是头节点时)。***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),n......
  • 两个链表相加,翻转链表
    将两个链表进行翻转,然后遍历链表进行相加翻转链表:reverseList(head){pre=null;//将遍历到的节点放在这个空节点的前面cur=head;while(cur!=null){temp =......
  • HJ48_从单向链表中删除指定值的节点_单向链表
    自定义类型链表:用链表的方式实现链表的生成、插入和删除。思路:需要两个class,一个为node,用与生成节点,一个为linklist,用于定义节点操作以及初始化head头节点。因为单向链......
  • 删除链表的第N个节点|栈、双指针
    删除链表的倒数第N个节点类似于删除链表中的第N个节点,但是这里是倒数第N个且不知道链表的长度,如果用删除第N个节点的方法去解决问题的时候需要先知道链表的长度。这就需......
  • 两两交换链表中的节点|递归
    两两交换链表中的节点链表中每两两相邻的节点将其对调位置,涉及的主要操作位交换节。但需要注意初始位置的交换即返回值,以及奇数个节点的处理方法,这里给出两种方法,迭代和......
  • 环形链表|哈希、快慢指针
    环形链表判断一个链表中是否有环,如果有返回环的起始位置。难点有两个,一是判断是否有环,二是找到起始点。这里有两种方法,一种是哈希集,另一种是快慢指针。对应题目142.环......
  • 反转链表|递归
    反转链表将链表反转过来,可以对比反转数组,但是链表由于不知道链表大小所以反转数组的方法在这里会变得复杂。这里有两种方法,双指针和递归法。对应题目206.反转链表......
  • 双循环链表 by lyx
    #include<iostream>usingnamespacestd;template<classT>structDblNode{  Tdata;  DblNode<T>*lLink,*rLink;  DblNode(DblNode<T>*l=NULL,DblNod......
  • 最长回文字串之暴力解法
    最长回文字串是一个典型的算法问题,首先要搞清楚什么是回文。回文,故名思义就是对称的文字,比如“ABA”,比如“ABABC”中的“AB“。题目如下:给你一个字符串s,找到s中最长......
  • 链表的遍历
    练习1:一组整数已存放在带头结点的单链表中,设计算法,求结点值小于结点平均值的结点个数,并通过函数值返回结果。 #include<stdio.h>#include<stdlib.h>typedefstructnode{......