203. 移除链表元素
- 题目
- 方法1递归
- 方法2迭代
题目
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
方法1递归
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
if (head == nullptr) {
return head;
}
head->next = removeElements(head->next, val);
return head->val == val ? head->next : head;
}
};
removeElements(head->next, val) 这个操作会删除链表 head 中所有与给定值 val 相等的节点。但是没有判断头节点
每次传入的参数 head->next 都是链表中当前节点的下一个节点。这个操作会不断地遍历链表,直到最后一个节点。在遍历的过程中,如果发现当前节点的值等于 val,那么就将当前节点删除。
通过递归调用,我们可以不断地在链表中搜索并删除符合条件的节点。最终,整个链表会被遍历一遍,并且所有与 val 相等的节点都会被删除。
return head->val == val ? head->next : head;这行判断了头节点的值有没有和val相等
方法2迭代
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
struct ListNode* dummyHead = new ListNode(0, head);
struct ListNode* temp = dummyHead;
while (temp->next != NULL) {
if (temp->next->val == val) {
temp->next = temp->next->next;
} else {
temp = temp->next;
}
}
return dummyHead->next;
}
};
struct ListNode* dummyHead = new ListNode(0, head);
ListNode结构体:这是一个链表节点的自定义结构体。它包含两个成员变量:一个是存储节点值的val,另一个是指向下一个节点的指针next。
temp->next = temp->next->next;删除下一个节点