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

 

posted @ 2021-03-03 09:38  健丽  阅读(56)  评论(0编辑  收藏  举报