Leetcode203. 移除链表元素

135 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

203. 移除链表元素

  • 题号:力扣203
  • 知识点:链表
  • 总结 题干: 在这里插入图片描述 在这里插入图片描述

思路:

  • 1.题意比较简单,C++代码如下:
  • 2.第一个while循环用来处理头结点,如果头结点的值等于val的话,需要将头结点后移,后移后并将原来的头结点删除
  • 3.第二个while循环用来处理非头结点,如果当前结点的后继结点的值等于val,需要将后继结点删除,也就是让当前结点的后继结点指向当前结点的后继结点的后继结点(跳过一个后继结点,就相当于删除了,后面的delete是为了释放没有的结点所占的空间) 有点绕。。,这一步需要一个临时指针指向当前结点的后继结点,避免释放空间的时候找不到他。
  • 4.如果当前结点的后继结点的值 != val,那就继续往后遍历
  • 5.最后返回的是头结点(第二个while循环中没有移动head)
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        while (head != NULL && head->val == val){
            ListNode *tmp = head;
            head = head->next;
            delete tmp;
        }
        ListNode *cur = head;
        while(cur != NULL && cur->next != NULL){
            if (cur->next->val == val){
                ListNode * temp = cur->next;
                cur->next = cur->next->next;
                delete temp;
            }
            else{
                cur = cur->next;
            }
        }
        return head;

    }
};
  • 第二种解法,在head之前添加了一个结点,因此不需要对头结点单独处理。如果理解了第一种方法这种解法就很容易理解了。注意最后返回的时候是ret->next
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 设置的结点
        ListNode *ret = new ListNode(0);
        ret->next = head;
        ListNode *cur = ret;
        while(cur->next != NULL){
            if (cur->next->val == val){
                ListNode *tmp = cur->next;
                cur->next = tmp->next;
                delete tmp;
            }
            else{
                cur = cur->next;
            }
        }
        // 注意返回不是head
        return ret->next;
    }
};