202. Happy Number( 快乐数)

这一题的解决与之前的循环链表比较类似,因为如果不是快乐数的话,在数字变化的过程中必然遇到了数字变换的循环,所以我们需要在变换的过程中判断是否遇到了循环,判断是否在一个序列中存在循环,我们可以使用与之前在leetcode刷题日记:141. Linked List Cycle(环形链表)类似的思想,让一个数每次变化两次然后一个数每次变化一次,如果存在循环,两个数必然会出现相等的情况。
可以写出代码如下:

int HappyNumber(int n){
    int x = 0;
    while(n){
        int b = n%10;
        x += b*b;
        n/=10;
    }
    return x;
}
bool isHappy(int n) {
    int fast=0;
    int slow=1;
    fast = n;
    slow = n;
    int flag = 1;
    while(fast!=slow||flag){
        slow = HappyNumber(slow);
        fast = HappyNumber(fast);
        if(fast!=1){
            fast = HappyNumber(fast);
        }else{
            return 1;
        }
        flag = 0;
    }
    return 0;
}

运行结果截图如下:
leetcode刷题日记:202. Happy Number( 快乐数)和203. Remove Linked List Elements(移除链表元素)-LMLPHP

203. Remove Linked List Elements(移除链表元素)

移除链表元素我们就按照移除链表的规则进行就行,注意链表头结点的特殊性。
画出图示如下:
删除头结点的操作
leetcode刷题日记:202. Happy Number( 快乐数)和203. Remove Linked List Elements(移除链表元素)-LMLPHP
leetcode刷题日记:202. Happy Number( 快乐数)和203. Remove Linked List Elements(移除链表元素)-LMLPHP
释放p所指向的空间,然后让p指向头结点
leetcode刷题日记:202. Happy Number( 快乐数)和203. Remove Linked List Elements(移除链表元素)-LMLPHP
删除其他的结点的操作:
leetcode刷题日记:202. Happy Number( 快乐数)和203. Remove Linked List Elements(移除链表元素)-LMLPHP
leetcode刷题日记:202. Happy Number( 快乐数)和203. Remove Linked List Elements(移除链表元素)-LMLPHP

有了上述的思路我们可以写出下面的代码:

struct ListNode* removeElements(struct ListNode* head, int val) {
    struct ListNode * p = head, *q = NULL;
    while(p!=NULL){
        if(p->val==val){
            if(p==head){
                head = p->next;
                free(p);
                p = head;
            }else{
                q->next = p->next;
                free(p);
                p = q->next;
            }
        }else{
            q = p;
            p = p->next;
        }
    }
    return head;
}

运行结果截图:

leetcode刷题日记:202. Happy Number( 快乐数)和203. Remove Linked List Elements(移除链表元素)-LMLPHP

11-20 19:37