203. 移除链表元素

203. 移除链表元素

  • 题目
  • 方法1递归
  • 方法2迭代

题目

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
203. 移除链表元素_第1张图片

方法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;删除下一个节点

你可能感兴趣的:(leetcode,链表,数据结构)