Palindrome Linked List

来源:互联网 发布:vb程序中的对象的行为 编辑:程序博客网 时间:2024/05/16 09:07

题目大意:判断一个单链表是否是回文串。要求O(n)时间和O(1)空间。

解题思路:快慢指针确定链表中间节点,再逆转后半部分节点,再同时从两端向中间遍历链表。

代码如下:

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     struct ListNode *next; * }; */bool isPalindrome(struct ListNode* head) {    struct ListNode *fast, *slow, *p=NULL, *q=NULL, *r=NULL, *tail;    if(head==NULL) {        return true;    }    fast=head;    slow=head;    while(fast->next!=NULL &&fast->next->next!=NULL) {        slow = slow->next;        fast = fast->next->next;    }    p = slow;    if(p!=NULL) {        q = p->next;    }    p->next=NULL;  //消除环。少了这一行提交的时候会超时,但是本地运行能得到正确答案,应该是系统检测到最终链表中出现了环。    while(q!=NULL) {        r = q->next;        q->next = p;        p = q;        q = r;    }    tail = p;    while(head!=slow) {        if(head->val==tail->val){            head = head->next;            tail = tail->next;        }else {            return false;        }    }    if(head->val == tail->val) {        return true;    }    else {        return false;    }}


0 0
原创粉丝点击