203. 移除链表元素(C++)

2021-06-11 19:02

阅读:514

标签:elements   struct   列表   删除   else   move   nta   delete   使用   

目录
  • 题目
  • 分析与题解
    • 区分头结点
    • 统一删除节点代码(增加虚节点)

题目

删除链表中等于给定值 val 的所有节点。

示例:

输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5

分析与题解

区分头结点

直接使用给定的头结点进行节点的删除。此时需要对头结点跟其他节点的删除进行分类讨论。

对于首节点的情况,我们先保存首节点的位置,再向后移动头指针,最后释放删除节点的空间

while (head != NULL && head->val == val) { // 注意这里不是if
            ListNode* tmp = head;
            head = head->next;
            delete tmp;
        }

当退出循环时,可以确定的是首节点对应的值肯定不为目标值,我们再对非首节点的目标节点进行删除:

		ListNode* cur = 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;
            }
        }

为了避免影响头指针的位置,我们使用额外指针对链表剩余节点进行遍历。每次需要对当前结点和下一个结点是否为空进行讨论。

完整代码如下:

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 先考虑头结点为目标值的情况
        while (head != nullptr && head->val == val) {
            // 先获取待删除元素 方便进行空间释放
            ListNode* tmp = head;
            head = head->next;
            delete tmp;
        }

        // 退出上述循环说明首位元素值不为目标节点
        // 使用另一个变量进行内部节点删除的循环
        // 保持头结点位置正确性 方便进行返回
        ListNode* cur = head;
        while (cur != nullptr && cur->next != nullptr) {
            if (cur->next->val == val) {
                ListNode* tmp = cur->next;
                cur->next = cur->next->next;
                delete tmp;
            }
            else if (cur->next->val != val)
                cur = cur->next;
        }
        return head;
    }
};

统一删除节点代码(增加虚节点)

不直接使用题目给定的头节点指针,在之前先添加一个虚节点,以此保证删除节点代码风格的统一。

ListNode* dummyNode =new ListNode(0);
dummyNode->next = head;

另外需要注意,在定义链表结构体的时候,我们采用构造函数初始值列表来进行初始化,冒号后以成员变量名(成员初始值)的形式进行初始化。

花括号内为空函数的原因是该列表的唯一目的是为数据成员赋初值,一旦没有其他任务需要执行,函数体也就为空了。

struct LinkedNode {
	int val;
	LinkedNode* next;
	LinkedNode(int val):val(val), next(nullptr){}
};

最后所有元素按照链表内的节点删除来进行处理,完整代码如下:

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 先考虑头结点为目标值的情况
        while (head != nullptr && head->val == val) {
            // 先获取待删除元素 方便进行空间释放
            ListNode* tmp = head;
            head = head->next;
            delete tmp;
        }

        // 退出上述循环说明首位元素值不为目标节点
        // 使用另一个变量进行内部节点删除的循环
        // 保持头结点位置正确性 方便进行返回
        ListNode* cur = head;
        while (cur != nullptr && cur->next != nullptr) {
            if (cur->next->val == val) {
                ListNode* tmp = cur->next;
                cur->next = cur->next->next;
                delete tmp;
            }
            else if (cur->next->val != val)
                cur = cur->next;
        }
        return head;
    }
};

203. 移除链表元素(C++)

标签:elements   struct   列表   删除   else   move   nta   delete   使用   

原文地址:https://www.cnblogs.com/buryinshadow/p/14220605.html


评论


亲,登录后才可以留言!