【力扣-链表】1、移除链表元素(203)

212 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

203. 移除链表元素

给你一个链表的头节点 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
输出: []

解题方法

这里有两种操作链表的方式:

  • 直接使用原来的链表来进行删除操作
  • 设置一个虚拟头节点,再进行删除操作

不设置虚拟头节点

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 1、删除头节点
        while (head != NULL && head->val == val)
        {
            ListNode *tmp = head;
            head = head->next;
            delete tmp;
        }

        // 2、删除其他节点(非头节点)
        ListNode *cur = head;
        // 非头节点,cur初始指向头节点,所以查找cur后面的节点的值是否为val
        while (cur != NULL && cur->next != NULL)
        {
            if (cur->next->val == val)
            {
                ListNode *tmp = cur->next;
                cur->next = cur->next -> next;
                delete tmp;
            }
            else
            {
                // 向后查找节点
                cur = cur->next;
            }
        }
        return head;
    }
};

图片.png

设置虚拟头节点

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 设置一个虚拟头节点
        ListNode *dummyHead = new ListNode(0);
        // 将虚拟头节点的next指针指向head , 方便后面的操作
        dummyHead->next = head;
        // 设置当前节点指向虚拟头节点
        ListNode *cur = dummyHead;
        while (cur->next != NULL)
        {
            // 若当前节点的下一个节点的值等于要删除的值
            if (cur->next->val == val)
            {
                // 记录要删除的节点
                ListNode *tmp = cur->next;
                // 将链接重置
                cur->next = cur->next->next;
                // 删除节点
                delete tmp;
            }
            else
            {
                // 继续向后查找节点
                cur = cur->next;
            }
        }

        head = dummyHead->next;
        delete dummyHead;
        return head;
    }
};

图片.png

【参考】:代码随想录