LeetCode 之 Palindrome Linked List — C++ 实现

原创 2015年07月10日 21:34:17

Palindrome Linked List

 

Given a singly linked list, determine if it is a palindrome.

Follow up:
Could you do it in O(n) time and O(1) space?

给定一个单链表,判断是不是回文。

追问:可否实现时间复杂度为 O(n),空间复杂度为 O(1)。


分析:

    根据要求,需要在原链表上进行操作。可以将链表前半部分翻转,然后再和后半部分进行比较。

注意:要判断节点个数是偶数还是奇数,奇数个节点时中间节点不参与比较。

class Solution {
public:
    bool isPalindrome(ListNode* head) {
        if(!head || !head->next)//空或者一个节点
        {
            return true;
        }
        
        ListNode *pre = NULL, *ne = NULL;//pre指向已经反转好的头节点
        ListNode *phalf = head, *p = head;
        bool ovenNode = false;//判断节点数是偶数还是奇数
        while(p->next) //找出中间节点,并将前一半节点翻转
        {
            ne = phalf;
            phalf = phalf->next;
            p = p->next;
            if(p->next)//p移动两次,phalf移动一次
            {
                p = p->next;
            }
            else
            {
                ovenNode = true;
            }
            
            if(ne == head)//第一次不翻转
            {
                head->next = NULL;
                pre = head;
            }
            else
            {
                ne->next = pre; //翻转
                pre = ne;
            }
            
        }
        
        if(!ovenNode) //奇数个节点,跳出中间节点不比较
        {
            phalf = phalf->next;
        }
        
        while(phalf) //回文检测
        {
            if(pre->val != phalf->val)
            {
                return false;
            }
            phalf = phalf->next;
            pre = pre->next;
        }
        
        return true;
    }
};

LeetCode 206 Reverse Linked List(反转链表)(Linked List)(四步将递归改写成迭代)(*)

翻译反转一个单链表。原文Reverse a singly linked list.分析我在草纸上以1,2,3,41,2,3,4为例,将这个链表的转换过程先用描绘了出来(当然了,自己画的肯定不如博客上面...
  • NoMasp
  • NoMasp
  • 2016年01月14日 06:22
  • 3726

【LeetCode-面试算法经典-Java实现】【203-Remove Linked List Elements(删除单链表中的元素)】

【203-Remove Linked List Elements(删除单链表中的元素)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】代码下载【https://github.co...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月26日 07:21
  • 2297

数据结构:链表(linked-list)

链表分为单向链表(Singly linked lis)、双向链表(Doubly linked list)、循环链表(Circular Linked list)。...
  • juanqinyang
  • juanqinyang
  • 2016年05月09日 11:09
  • 2814

[LeetCode-234] Palindrome Linked List(回文链表、链表中间节点查找)

Given a singly linked list, determine if it is a palindrome. Follow up: Could you do it in O(n) tim...
  • xy010902100449
  • xy010902100449
  • 2015年10月08日 21:46
  • 443

(LeetCode 234)Palindrome Linked List

Leetcode第234题目是Palindrome Linked List。题目的描述如下: Given a singly linked list, determine if it is a pali...
  • willduan1
  • willduan1
  • 2016年03月06日 19:33
  • 6322

LeetCode 234: Palindrome Linked List (回文链表)

Given a singly linked list, determine if it is a palindrome.Follow up:Could you do it in O(n) time a...
  • sunao2002002
  • sunao2002002
  • 2015年07月16日 22:48
  • 11088

Leetcode 234. Palindrome Linked List

234. Palindrome Linked List Total Accepted: 69120 Total Submissions: 225579 Difficulty: Easy ...
  • fantasiasango
  • fantasiasango
  • 2016年10月07日 02:20
  • 194

[分析总结:leetcode-Palindrome Linked List] 给定单链表,判断链表是否为回文。

原题链接: https://leetcode.com/problems/palindrome-linked-list/ 题目描述:  1. 介绍什么事回文:就是正着念,反着念都一样的词句,...
  • cancan0520
  • cancan0520
  • 2015年07月14日 15:15
  • 238

Leetcode - Palindrome Linked List

Given a singly linked list, determine if it is a palindrome.Follow upCould you do it in O(n) time an...
  • roamer_nuptgczx
  • roamer_nuptgczx
  • 2016年05月03日 13:14
  • 169

leetcode | Palindrome Linked List 牛客网 |

Given a singly linked list, determine if it is a palindrome. Follow up: Could you do it in O(n) tim...
  • weizaishouex2010
  • weizaishouex2010
  • 2015年09月19日 12:21
  • 207
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode 之 Palindrome Linked List — C++ 实现
举报原因:
原因补充:

(最多只允许输入30个字)