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;
}
运行结果截图如下:
203. Remove Linked List Elements(移除链表元素)
移除链表元素我们就按照移除链表的规则进行就行,注意链表头结点的特殊性。
画出图示如下:
删除头结点的操作
释放p所指向的空间,然后让p指向头结点
删除其他的结点的操作:
有了上述的思路我们可以写出下面的代码:
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;
}
运行结果截图: