题目描述:
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1 输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7 输出:[]
提示:
- 列表中的节点数目在范围
[0, 104]
内 1 <= Node.val <= 50
0 <= val <= 50
代码实现:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val) {
struct ListNode *p=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode *q;
p->next=head;
q=p;
while(p->next!=NULL)
{
if(p->next->val==val)
{
p->next=p->next->next;
}
else
{
p=p->next;
}
}
return q->next;
}
解题思路:
我们建立两个虚拟的头结点(避免删除的是head),当头结点的内容不为空时,判断当前结点指向的下一个结点中的数据是否与val相等,如果相等就令当前结点指向下下一个结点(删除当前结点的下一个结点),如果不相等就令头结点移向后一位。
二.快乐数
题目描述:
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
示例 1:
输入:n = 19 输出:true 解释: 12 + 92 = 82 82 + 22 = 68 62 + 82 = 100 12 + 02 + 02 = 1
示例 2:
输入:n = 2 输出:false
提示:
1 <= n <= 231 - 1
代码实现:
int bad(int n)
{
int s=0;
int a;
while(n>0)
{
a=n%10;
s=s+a*a;
n=n/10;
}
return s;
}
bool isHappy(int n) {
int slow=n,fast=n;
do
{
slow=bad(slow);
fast=bad(fast);
fast=bad(fast);
}while(slow!=fast);
return slow==1;
}
解题思路:
首先写一个函数实现将该数替换为它每个位置上的数字的平方和的功能,在判断是否为快乐数的函数中,我们可以设置一个循环,利用快慢指针的思想,每次让快指针走两步,慢指针走一步,当跳出循环时判断是否是因为1的原因,是则这个数是快乐数。