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; } };
但是判断总是出错。
关键在于循环里面的两个句子:
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。
纵一苇之所如,临万顷之茫然。

浙公网安备 33010602011771号