判断回文链表

/**

 * Definition for singly-linked list.

 * struct ListNode {

 *     int val;

 *     struct ListNode *next;

 * };

 */

//逆置函数

struct ListNode* reverseList(struct ListNode* head)

{

    

     if(head == NULL)//判断是否为空;

        return NULL;

        

    struct ListNode* newnode = NULL;

    struct ListNode* cur = head;

    while(cur)

    {

        struct ListNode* next = cur->next;//迭代过程

        //头插法

        cur->next = newnode;

        newnode = cur;

        cur = next;//迭代过程

    }    

    return newnode;

}

//中间节点函数

struct ListNode* middleNode(struct ListNode* head)

{

    struct ListNode* fast = head;//注意:这里不能用head->next

    struct ListNode* slow = head;

    while(fast && fast->next)//注意这里的顺序:fast在前面

    {

        fast = fast->next->next;

        slow = slow->next;

    }

    return slow;

}

bool isPalindrome(struct ListNode* head){

    //方法一:

    //开辟一个数组a[],再按照数组的方式来比较;

    //方法二:

    //找中间节点、后半部分逆置、再比较

    struct ListNode* mid = middleNode(head);

    struct ListNode* rmid = reverseList(mid);

    //现在从头节点和rmid节点开始往后比较

    while(head && rmid)

    {

        if(head->val == rmid->val)

        {

            head = head->next;

            rmid = rmid->next;

        }

        else

        {

            return false;

        }

    }

    return true;

    //此题元素个数为奇数时有个巧合,建议画图理解,

    //奇数个时,理应把mid前一个元素的next置为空,但此时这个next刚好指向逆置后的最后一个元素,那么最后一次比较即为同一个元素,再往后走就是NULL了;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值