举个例子,链表里有元素,我们想要移除的元素值为1如下:
个人认为的主要思想就是:先记录后删除
1->5->2->5->8->1->0
NULL
0->5->2->5->8->1->0
对于头结点我们有三种情况
- 头结点为元素1
- 头结点元素为空null
- 头节点为其他元素,不为我们要删除的元素1
对于情况1,我们就需要特殊处理,要删掉它之后,头结点要移动到它的下个结点,然后再把它删去,才可以,所以我们就要提前记录下这个要被删除的原头结点。
关键代码为
ListNode *tmp=head;
head=head->next;
delete tmp;
对于情况2
完全就不需要管,因为是空链表,最后直接返回链表的头结点时,直接就是空就可以了
对于情况3,就是删除非头结点的操作。
对于非头结点:
下面我们来写,删除非头结点的操作
过程就是,我们遍历链表,如果遇到了等于要删除的元素,也是同样的把这个结点记录下来,然后把连接这个删除结点的前后两个结点,然后才是把这个纪律下的结点删除。
完整代码为:
class Solution {
public:
ListNode* remove(ListNode* head, int val) {
while (head != nullptr && head->val == val) {
ListNode* t = head;
head = head->next;
delete t;
}
ListNode* cur = head;
while (cur != nullptr && cur->next != nullptr) {
if (cur->next->val == val && cur->next != nullptr) {
ListNode* t = cur->next;
cur->next = cur->next->next;
delete t;
}
else {
cur = cur->next;
}
}
return head;
}
};
力扣203
标签:结点,ListNode,cur,元素,head,next,链表,移除 From: https://www.cnblogs.com/FJCLJ/p/16794117.html