leetcode刷题日记——Palindrome Linked List

来源:互联网 发布:软件详细设计方案 编辑:程序博客网 时间:2024/06/05 15:48
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),题目的解题的关键就在于想到把前半部分或者后半部分给颠倒一下。这里实现用的是颠倒链表的前半部分。需要注意一点的就是奇数和偶数个的链表略有不同。另外就是如果采用的颠倒前半部分,需要注意新的链表的开头部分不再是head指针了。其他都是简单的链表遍历和变更后继等简单操作。具体实现代码如下:

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    bool isPalindrome(ListNode* head) {        if(head==NULL) return true;        int count=0,kaishi=0,jiesu=0;        ListNode *p=head,*q=NULL,*m=NULL,*n=NULL,*temp=NULL;        while(p){            p=p->next;            count++;        }        if(count==1) return true;        if(count%2==0){            kaishi=(count/2);        }        else{            kaishi=(count/2)+1;        }        p=head;        while(kaishi){            p=p->next;            kaishi--;        }        q=p;        p=head;        jiesu=count/2;         while(jiesu){            p=p->next;             jiesu--;        }        n=p;        p=head;        jiesu=count/2;        while(jiesu){            m=p->next;            p->next=n;            n=p;            p=m;            jiesu--;        }        while(q){            if(n->val!=q->val) return false;            n=n->next;            q=q->next;        }        return true;    }};


0 0
原创粉丝点击