链表的回文结构

来源:互联网 发布:淘宝买身份证 编辑:程序博客网 时间:2024/04/30 09:27

题目要求:

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

测试样例:
1->2->2->1
返回:true
思路:

判断一个链表是不是回文数,要求O(n)时间

  1. 使用2个指针,快慢指针各一个,每次快指针移动一个,慢指针移动2个。

  2. 当快指针不为NULL时候,将慢指针push到栈中。

  3. 当快指针等于NULL时候,说明链表前半部分已经被压入栈中。

  4. 每次栈Top元素与当前慢指针元素比较,如果不相等则返回false。如果相等,则栈Pop,慢指针++。

  5. 链表奇数或者偶数节点需要判断。

代码如下:

链表结构:

struct ListNode {    int val;    struct ListNode *next;    ListNode(int x) : val(x), next(NULL) {}};
bool chkPalindrome(ListNode* A)    {        if(A==NULL)            return true;       ListNode *slow = A;       ListNode *fast = A;       stack<int> data;       bool flag = false;//判断链表节点各位是奇数个还是偶数个       while(fast)       {           data.push(slow->val);           slow = slow->next;           fast = fast->next;           if(fast)           {               fast=fast->next;           }           else           {                flag = true;//奇数个           }       }       if(flag)       {           data.pop();//链表节点为奇数个,则需要从栈中弹出一个节点       }       while(slow)       {           if(slow->val != data.top())                return false;           else            {                slow=slow->next;                data.pop();            }       }       if( slow == NULL && data.empty())//最终栈为空,并且slow指针为null,则链表为回文结构            return true;return false;//链表不为空或者slow指针部位NULL,链表不是回文结构





    }

1 0
原创粉丝点击