leetCode:234: Palindrome Linked List

来源:互联网 发布:手机淘宝如何上传宝贝 编辑:程序博客网 时间:2024/04/27 16:57


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?


问题需求:判断一个链表是否属于回文链表,所谓回文链表就是,从头到尾输出或者从到头输出结果都是一样。

问题分析:如果一个普通链表,围绕链表的中心点旋转180度,链表和原来是一样的,那么就是一个回文链表。引申开来,如果截取原链表的前半部分元素,每个元素以头插法形式插入另外一个空链表里,那么只要从头到尾比较这两个新链表元素,如果相同,原来那个链表就是回文链表。这里需要注意的是,如果原来链表元素是奇数个,那么就让原链表的元素个数==a1,新链表的元素个数==a2,a1 == a2+1,原链表从第二个原素才开始和新链表进行比较。

总体思路:

→将原链表结成两段:head和headCopy

→ 将head链表的前面一半,以头插法的方式插入到headCopy链表里面

→逐一比较两个链表元素是否对应相等,相等则是回文链表(注意原来链表元素个数,如果原来链表里的元素是偶数个,那么就是两个新的链表逐一比较,如果原来的链表元素的个数奇数,我这里的处理方式,是让链表head元素个数将比headCopy多一,那么就是head从第二个开始,headCopy从第一个开始,逐一比较)。

→为了节约运行时间,如果连表元素少于三个,不用截断,直接返回(空链表和只有一个元素的链表都算是回文链表,有两个元素的链表直接判断两个元素是否相等,就可以了)


/** * Definition for singly-linked list. * struct ListNode { *     int val; *     struct ListNode *next; * }; */ bool isPalindrome(struct ListNode* head) {/*注意参数是首元素地址,就是指向链表首元素的指针,就是没有头结点的链表*/       struct ListNode* p = NULL;    struct ListNode* q = NULL;    struct ListNode* headCopy = NULL;//他将保存原链表的前半部分    int num = 0;//记录链表元素个数    //如果他是一张空的链表    if(head==NULL)        return 1;    //如果这个链表只有一个元素    if(head->next==NULL)        return 1;        //如果这个链表只有两个元素    if(head->next->next==NULL){        if(head->val == head->next->val)//元素相等就是回文            return 1;        else            return 0;    }         //计算链表元素个数    p = head;//p point the first element of the list    num = 1;    while(p->next!=NULL){        p = p->next;        num++;    }        //以下操作为了截断这个链表    p = head;//重新让P指向链表首个元素    for(int i1 = 0;i1<num/2;i1++){        //每次循环从原链表截除一个元素到新链表        p = p->next;//让p指向原链表的第二个的元素        head->next = headCopy;//原连表的首个元素指向新链表的首个元素        headCopy = head;//新连表的头结点指向了原连表的首个元素        head = p;//原连表的头结点指向了原连表的第二个的结点    }    p = head;    q = headCopy;    if(num%2==1){//如果连表的元素个数为偶数        p = head->next;    }    while(p!=NULL){        if(p->val!=q->val)            return 0;        p = p->next;        q = q->next;    }    return 1;}





0 0
原创粉丝点击