本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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;
}
};