移除链表元素
前言
题目:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
一、示例
二、思路和代码
1.思路
运用力扣每日一题——删除链表中的节点的思路,把当前节点的值等于val的删除了,最后还剩一个节点没处理,只能再次遍历链表处理。2.代码
代码如下(示例):
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val){
if(head == NULL) {
return NULL;
}
int n = 0, m = 0;
struct ListNode* p = head;
//n记录有多少个节点
while(p != NULL) {
++n;
p = p->next;
}
if(1 == n && head->val == val) {
return NULL;
} else if(1 == n && head->val != val) {
return head;
}
p = head;
while(p != NULL){
if(head->val == p->val) {
++m; //m是记录有多少个相同的节点
}
p = p->next;
}
if(m == n && head->val == val) {
return NULL;
}
p = head;
while(p->next != NULL) {
if(p->val == val) {
p->val = p->next->val;
p->next = p->next->next;
continue;
}
p = p->next;
}
//还剩最后一个节点没处理
if(p->val == val) {
struct ListNode* q = head;
while(q->next != NULL) {
if(q->next->val == val) {
q->next = q->next->next;
break;
}
q = q->next;
}
}
return head;
}
结果如图所示: