CanTechLab

Can

Leetcode:203.移除链表元素

2024-05-17

Leetcode题目链接: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
输出:[]

解题思路:

添加虚拟头节点,循环遍历删除

  • 添加虚拟头节点 dummyHead 以实现链表第一个元素与链表中其他元素的统一删除操作,且dummyHead的指针指向实际链表的第一个元素位置

  • 定义遍历指针 current 指向当前的虚拟头节点

  • 这里我们将要删除的节点定义为 current -> next,那么当前删除节点的前驱节点为 current,当前删除节点的后继节点为current -> next -> next

  • 删除节点的步骤:

    • 记录要删除的节点的位置 即temp = current -> next

    • 将该节点的前驱节点与后继节点通过next指针链接上,保证链表的完整性,即current -> next = current -> next -> next

    • 手动释放当前要删除的节点的指针,即delete temp

    • 以上完成了一次删除操作,循环执行

  • 若要删除的节点不满足条件,则执行current = current -> next 跳过当前节点

  • 最终返回实际的表头节点(注意这里是dummyHead -> next而不是head)

我的答案:

/**
 * 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();
        dummyHead -> next = head;
        //遍历链表
        ListNode* current = dummyHead;
        while(current -> next != NULL){
            if(current -> next -> val == val){
                ListNode* temp = current -> next;
                current -> next = current -> next -> next;
                delete temp;
            }else{
                current = current -> next;
            }
        }
        //返回链表实际的头节点
        return dummyHead -> next;
    }
};

提交结果: