Leetcode链表203. 移除链表元素

题目描述

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

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

题解

思路一 设置前置节点

设置一个哨兵当作前置节点,用来应对删除头节点的情况,依次遍历原来链表的每个节点,每当找到要删除的节点,让前一个节点指向该节点的后一个节点,使用一个指针删除该节点的内存空间。

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* lamp = new ListNode(0);
        lamp->next = head;
        //设置哨兵,并连在头节点的前面//
        ListNode* pre = lamp;
        //保存当前节点的前一个节点//
        ListNode* cur = head;
        //当前节点//
        ListNode* todelete = NULL;
        //用于删除节点的内存空间//
        while(cur != NULL){
            todelete = NULL;
            if(cur->val == val){
                pre-> next = cur->next;
                todelete = cur;
                cur = cur->next;
                delete todelete;
            }
            //删除节点//
            else{
                pre = cur;
                cur = cur->next;              
            }
            //不是要删除的节点,继续//
        }
        ListNode* p = lamp->next;
        //获取新链表的头节点//
        delete lamp;
        //删除哨兵节点
        return p;
    }
};

思路二 递归

递归结束条件:到达尾节点 head == NULL
每到达一个节点,判断是否为删除节点:若是 return head->next;若不是 return head;

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        if(head != NULL)
          head->next = removeElements(head->next,val);
          //递归函数//
        if(head == NULL) return NULL;
        //递归结束条件//
        else if(head->val == val) return head->next;
        //删除节点
        else return head;
        //非目标节点
    }
};
发布了4 篇原创文章 · 获赞 2 · 访问量 98

猜你喜欢

转载自blog.csdn.net/dyz2121221/article/details/105737753