美文网首页
回文链表

回文链表

作者: 小白学编程 | 来源:发表于2018-08-28 09:49 被阅读0次

请判断一个链表是否为回文链表。

示例 1:

输入: 1->2
输出: false
示例 2:

输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

思路

反转链表,然后与原来相比较

bool isPalindrome(struct ListNode* head) {
    
    if(head==NULL||head->next==NULL){
        return true;
    }
    struct ListNode* node=head;
    struct ListNode* newHead=NULL;

    while(node!=NULL){
        struct ListNode* temp=(struct ListNode* )malloc(sizeof(struct ListNode));
        
        temp->val=node->val;
        temp->next=newHead;
        newHead=temp;
        
        
        node=node->next;
    }
    
    while(newHead!=NULL){
        if(newHead->val==head->val){
            newHead=newHead->next;
            head=head->next;
        }else{
            return false;
        }
    }
    return true;

思路

遍历链表,每个节点的值放在数组上,然后用快慢指针的方法判断该数组是否回文

bool isPalindrome(struct ListNode* head) {
   struct ListNode* temp=head;
    int i=0;
    while(temp!=NULL){
        temp=temp->next;
        ++i;
    }
    int a[i];
    for(int j=0;j<i;++j){
        a[j]=head->val;
        printf("%d",a[j]);
        head=head->next;
    }
    int start=0;
    int end=i-1;
    while(start<end){
        if(a[start]==a[end]){
            start++;
            end--;
        }else{
            return false;
        }
    }
    return true;
}

思路

用快慢指针法,fast一次走两步,slow一次走一步,等fast走到末尾,slow就在中间节点(这里分节点个数为奇数还是偶数),之后之后反转slow,与head相比

bool isPalindrome(struct ListNode* head) {
    
  if(head==NULL||head->next==NULL){
      return true;
  }
    
    struct ListNode* fast=head;
    struct ListNode* slow=head;
    
    
    while(fast!=NULL&&fast->next!=NULL){
        fast=fast->next->next;
        slow=slow->next;
    }
    struct ListNode* temp=NULL;
    struct ListNode* newHead=NULL;
    while(slow!=NULL){
        temp=slow->next;
        slow->next=newHead;
        newHead=slow;
        slow=temp;
    }
    fast=head;
    while(fast!=NULL&&newHead!=NULL){
        if(fast->val!=newHead->val){
            return false;
            
        }
        fast=fast->next;
        newHead=newHead->next;
        
    }
    return true;   
}

相关文章

  • 【日拱一卒】链表——回文判断

    需求 判断一个链表是否是回文链表 回文的形式大家应该都知道,类似 这种对称的方式都是回文。 难点 如果将链表形式换...

  • LeetCode 234. 回文链表

    234. 回文链表 请判断一个链表是否为回文链表。 示例 1: 输入: 1->2输出: false 示例 2: 输...

  • 漫谈递归-回文链表

    题目 234. 回文链表请判断一个链表是否为回文链表。 测试 示例 1:输入: 1->2输出: false 示例 ...

  • 02-14:leetcode重刷8之哈希与数组

    链表: 判断链表是否环形、是否回文 1、是否链表 #Definitionforsingly-linkedlist....

  • 2019-02-19 Day 45 待提高

    1.回文链表请判断一个链表是否为回文链表。 示例 1: 输入: 1->2输出: false示例 2: 输入: 1-...

  • LeetCodeDay13 —— 回文链表&环形链表

    234. 回文链表 描述 请检查一个链表是否为回文链表。 进阶 你能在 O(n) 的时间和 O(1) 的额外空间中...

  • Swift 回文链表 - LeetCode

    题目: 回文链表 请判断一个链表是否为回文链表。 示例1: 示例2: 进阶你能否用 O(n) 时间复杂度和 O(...

  • Swift - LeetCode - 回文链表

    题目 回文链表 问题: 请判断一个链表是否为回文链表。 进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复...

  • LintCode 回文链表

    题目 设计一种方式检查一个链表是否为回文链表。 样例1->2->1 就是一个回文链表。 分析 链表由于其特殊的结构...

  • 链表——回文链表

    这个题属实不算难,但是因为出在链表部分,很容易让人误会是使用链表的特性来解题,但是实际上还是使用普通的回文串判别的...

网友评论

      本文标题:回文链表

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