链表 | LeetCode 203 移除链表元素

101 阅读1分钟

题目描述

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

本题思路

两种操作方式

  • 直接使用原来的链表来进行删除操作。删除头节点和非头节点的操作不同,删除头节点直接将头节点head指针指向下一个元素并将之前的头节点释放
  • 设置一个虚拟头结点在进行删除操作。统一了头节点与非头节点的删除操作

直接删除

代码如下:

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 删除元素是头结点
        while (head != NULL && head->val == val) { // 会不断的判断头节点或者说更换后的头节点是否为删除元素
            ListNode* tmp = head;
            head = head->next;
            delete tmp;
        }
        // 删除元素是非头节点
        ListNode* cur = head; // 用以存放head来遍历,不使用head
        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;
    }
};

虚拟头节点

代码如下:

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode *dummyhead = new ListNode(0); //定义了一个头结点 
        dummyhead->next = head; //虚拟头节点与单链表链接
        ListNode *cur = dummyhead; //只是单单指向了head所指的节点,并没有开辟新节点
        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;
            }
        }
        head=dummyhead->next;
        delete dummyhead;
        return head;
    }
};