美文网首页
每日一算法之判断回文联表

每日一算法之判断回文联表

作者: MzDavid | 来源:发表于2018-11-30 15:00 被阅读6次

    请判断一个链表是否为回文链表。

    示例 1:

    输入: 1->2
    输出: false
    

    示例 2:

    输入: 1->2->2->1
    输出: true
    

    进阶:
    你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?(leetcode原题

    拿到这个题的时候,看到给出的第二个示例以及要求O(1) 空间复杂度就知道要利用链表逆序思想,将链表后半部分逆序。然后从前到中和从后到中一一对比即可。

    实现代码:

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     struct ListNode *next;
     * };
     */
    bool isPalindrome(struct ListNode* head) {
        if(head==NULL || head->next == NULL){
          return true;  
        }
            
        bool result = true;
        struct ListNode* node1 = head;
        struct ListNode* node2 = head;
        struct ListNode* node3 = NULL;
        
        //node2每次跳两步,node1每次跳一步,当node2->next或者node2->next->next为空时
        //链表个数为奇数,node1就处在中间位置,
        //链表个数为偶数,node1和node1->next就是中间两个位置。
        while(node2->next!=NULL && node2->next->next !=NULL){
            node2 = node2->next->next;
            node1 = node1->next;
        }
        
        //逆序后半段链表
        // 1->2->3->3->2->1
        //     转为
        // 1->2->3<-3<-2<-1
        node2 = node1->next;
        node1-> next = NULL;
        while(node2!=NULL){
            node3 = node2->next;
            node2->next = node1;
            node1 = node2;
            node2 = node3;
        }
        
        node3 = node1;
        node2 = head;
        
        //从前端和后端开始对比数字
        while(node2!=NULL && node1!=NULL){
            if(node2->val != node1->val){
                result = false;
                break;
            }
            node2 = node2->next;
            node1 = node1->next;
        }
        
        //在程序中应该把链表恢复原样,毕竟还有可能要用到这个链表,参照上面,这里就偷懒没写了
        
        return result;
    }
    

    好久没有写算法了,为了链表的逆序在纸上画了半天才理清逻辑。。。

    相关文章

      网友评论

          本文标题:每日一算法之判断回文联表

          本文链接:https://www.haomeiwen.com/subject/jxrhcqtx.html