- 题号:力扣203
- 知识点:链表
- 目标完成度:53/150
- 总结
题干:
思路:
- 1.题意比较简单,C++代码如下:
- 2.第一个while循环用来处理头结点,如果头结点的值等于val的话,需要将头结点后移,后移后并将原来的头结点删除
- 3.第二个while循环用来处理非头结点,如果当前结点的后继结点的值等于val,需要将后继结点删除,也就是让当前结点的后继结点指向当前结点的后继结点的后继结点(跳过一个后继结点,就相当于删除了,后面的delete是为了释放没有的结点所占的空间) 有点绕。。,这一步需要一个临时指针指向当前结点的后继结点,避免释放空间的时候找不到他。
- 4.如果当前结点的后继结点的值 != val,那就继续往后遍历
- 5.最后返回的是头结点(第二个while循环中没有移动head)
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
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;
}
};



