判断回文链表(C语言)

声明:题目来源:力扣(LeetCode)

链表的回文结构。

题目链接:回文链表

示例 1:

输入: 1->2
输出: false

示例 2:

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

思路:先找中间节点,再将中间节点之前的链表逆置,最后从头和中间节点出发判断节点的值是否相等。需要注意的是,若链表节点数为偶数个,例:

1 —> 2 —> 2 —> 1

则需要逆置为:

2 —> 1 —> 2 —> 1

再同时从 “2” 出发,判断节点值是否相等。
若节点数为奇数个,例:

1 —> 2 —> 3 —> 2 —> 1

则需要逆置为:

2 —> 1 —> 3 —> 2 —> 1

正中间的节点我们不管它,同时从 “2” 这个节点的位置出发判断节点值是否相等。

代码写的有点乱,不过参考一下问题不大:

bool isPalindrome(struct ListNode* head){
    if(head == NULL || head->next == NULL){
        return true;
    }
    struct ListNode* mid1 = head;
    struct ListNode* tmp = head->next;
    while(tmp && tmp->next != NULL){
        mid1 = mid1->next;
        tmp = tmp->next->next;
    }
    struct ListNode* mid2 = mid1->next;
    struct ListNode* cur = mid2->next;
    while(cur != NULL){
        mid2->next = cur->next;
        cur->next = mid1->next;
        mid1->next = cur;
        cur = mid2->next;
    }
    mid2 = mid1->next;
    cur = head;
    while(mid2 != NULL){
        if(cur->val != mid2->val){
            return false;
        }
        cur = cur->next;
        mid2 = mid2->next;
    }
    return true;
}

你可能感兴趣的:(数据结构(Data,Structure),算法,单链表,C语言,算法题,数据结构)