LeetCode-203 删除链表元素

一、题目描述

删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5

二、解题思路

解法1:

删除结点的步骤
1. 找到该结点的前一个结点
2. 进行删除操作
除头结点时另做考虑(由于头结点没有前一个结点)

代码实现

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        while (head != nullptr && head->val == val) {
            head = head->next;
        }

        if (head == nullptr) return head;
        ListNode *prev = head;
        // 确保当前节点后还有节点
        while (prev->next != nullptr) {
            if (prev->next->val == val) {
                prev->next = prev->next->next;
            } else {
                prev = prev->next;
            }
        }
        return head;
    }
};

解法2:

避免分别处理头结点和剩余节点,可以通过在头结点前增加一个节点,统一操作

代码实现:

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        while (head != nullptr && head->val == val) {
            head = head->next;
        }

        if (head == nullptr) return head;
        ListNode *prev = head;
        // 确保当前节点后还有节点
        while (prev->next != nullptr) {
            if (prev->next->val == val) {
                prev->next = prev->next->next;
            } else {
                prev = prev->next;
            }
        }
        return head;
    }
};

可以模拟下程序的执行步骤,加深理解

四、总结

链表题涉及到指针的操作,应当足够细心,栓新绳,解旧绳
相似题型:反转单链表

参考链接:https://leetcode-cn.com/problems/remove-linked-list-elements/solution/203yi-chu-lian-biao-yuan-su-by-lewis-dxstabdzew/

你可能感兴趣的:(LeetCode-203 删除链表元素)