zoukankan      html  css  js  c++  java
  • 2020-3-3 链表刷题(203. 移除链表元素)

    题目链接:https://leetcode-cn.com/problems/remove-linked-list-elements/

    题目说明:

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

    示例:

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

    题目思路:

    删除链表中的元素会面临删除头节点,删除中间元素,删除最后一个元素,删除中间元素跟最后一个元素直接用指针进行就可以了,重点是删除头节点。

    删除头节点可以有两种方式1、直接编写一段逻辑代码进行对头节点的删除

                2、设置一个虚拟头结点,进行全部的的结点删除

    编写代码:

     1 class Solution {
     2 public:
     3     ListNode* removeElements(ListNode* head, int val) {
     4         //进行设置一个虚拟结点,用于如果删除头节点,可方便操作
     5         //相当于 虚拟头节点进行初始化
     6         ListNode* dummyHead = new ListNode(0); 
     7         //将设置的虚拟头结点链接到本身的链表上
     8         dummyHead->next = head; // 将虚拟头结点指向head,这样方面后面做删除操作
     9         ListNode* cur = dummyHead;
    10 
    11         while (cur->next != NULL) {
    12             if(cur->next->val == val) {
    13                 ListNode* tmp = cur->next;
    14                 cur->next = cur->next->next;
    15                 delete tmp;
    16             } else {
    17                 cur = cur->next;
    18             }
    19         }
    20         return dummyHead->next;
    21     }
    22 };

    另一种专门针对头节点在进行删除的代码:

    抄录于:https://mp.weixin.qq.com/s/slM1CH5Ew9XzK93YOQYSjA

    代码:

    class Solution {
    public:
        ListNode* removeElements(ListNode* head, int val) {
            // 删除头结点 
            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;
                }
            }
            return head;
        }
    };

    链表知识点巩固:

    链表于数组对比,数组连续存储于内存,链表存储在内存空间中不是连续的,如果使用C/C++ 语言编写,记得在删除元素后,进行内存单元的释放(delete 结点),JAVA PYTHON语言则有自己的内存回收机制。

  • 相关阅读:
    C#编程(四十一)----------用户定义的数据类型转换
    C#编程(四十)----------运算符重载
    C#编程(三十九)----------比较对象的相等性
    下载mqtt.fx
    python3 mqtt 客户端以及服务端
    mac 下使用nasm
    shell equal
    python client.py
    常见面试题
    mysql 包含查找
  • 原文地址:https://www.cnblogs.com/gjianli/p/14472674.html
Copyright © 2011-2022 走看看