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语言则有自己的内存回收机制。

  • 相关阅读:
    Java中List集合去除重复数据的六种方法
    常见的Redis面试"刁难"问题,值得一读
    以Integer类型传参值不变来理解Java值传参
    Linux系统安装snmp服务
    直接取数据到RANGE
    SAP翔子_2019集结号
    销售订单BOM组件分配(CP_BD_DIRECT_INPUT_PLAN_EXT)
    SAP翔子_webservice篇索引
    函数篇3 EXCEL导入函数去除行数限制
    ABAP基础篇4 常用的字符串操作语法
  • 原文地址:https://www.cnblogs.com/gjianli/p/14472674.html
Copyright © 2011-2022 走看看