leetcode203_移除链表元素

一、题目描述

  题目

 

 

 二、分析

   其实只是一个对情况判断就好了,主要是对头结点的判断,对空的情况的判断,然后就是对循环的判断,当然这个也可以用迭代的方法来做。

   初始的时候我的代码如下:

/**
 * 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) {
        if(head == NULL )//如果链表为空,则返回
            return head;
        struct ListNode* pre_node = head;
        //初始头结点不能为val
        while(head!=NULL && head->val==val){
            head = head->next;
        }
        
        while(pre_node->next !=NULL){
            if(pre_node->next->val != val) {
                pre_node = pre_node->next;
                continue;
            }
            else{//如果等于val
                pre_node->next = pre_node->next->next;
                if(pre_node->next)
                    pre_node = pre_node->next;
            }
        }
        
        return head;
    }
};
View Code

  但是判断总是出错。

   关键在于循环里面的两个句子:

   

 else{//如果等于val
                pre_node->next = pre_node->next->next;
                if(pre_node->next)
                    pre_node = pre_node->next;
            }

   在如果是val的情况下,删除那一步是没有问题的,但是关键在于,我直接把pre_node 赋值为pre_node->next,然后下一个循环直接对pre_node->node进行检查,这样就跳过了一个元素。

   如果把if判断删除掉也是不行的,这样就无法检验pre_node为空的情况。

    所以只能把这两个代码都删除掉,在下一个循环在进行判断。

三、代码

   

/**
 * 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) {
        if(head == NULL )//如果链表为空,则返回
            return head;
        struct ListNode* pre_node = head;
        //初始头结点不能为val
        while(head!=NULL && head->val==val){
            head = head->next;
        }
        
        while(pre_node->next !=NULL){
            if(pre_node->next->val != val) {
                pre_node = pre_node->next;
                continue;
            }
            else{//如果等于val
                pre_node->next = pre_node->next->next;
            }
        }
        
        return head;
    }
};

    不得不说,单链表都快忘记完了。

四、总结

    这里有个地方需要注意,就是头结点的next指向的是第一个元素的地址,所以如果链表空位的话,那么头结点的next为NULL。

    

 

posted @ 2021-11-06 19:08  星光夜  阅读(27)  评论(0)    收藏  举报