(学习内容来自《代码随想录》)
题目链接:力扣
方法一和方法二总的思路都是遍历链表,创建一个临时链表,使该临时链表的头节点地址等于原链表的头节点地址。利用临时链表遍历,判断当前链表指向的下一个链表值是否是目标值,如果是的话,那么就使当前链表的尾节点指向下一个链表的尾节点。如果不是,就更新当前链表,使当前链表指向当前链表的尾节点,继续遍历。最后,返回头节点地址即可。
##方法一:原链表移除元素
关键在于头节点和非头节点的处理。
如果是头节点,先判断头节点值是否是目标值,如果是的话,就一直往后遍历,更新头节点。同时,因为是c++编程,最好再释放一下不需要的内存。
如果是非头节点,就和一般的思路是一样的。
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)
cur->next = cur->next->next;
else
cur = cur->next;
}
return head;
}
};
##方法二:使用虚拟头节点
创建一个虚拟链表,使该虚拟链表指向链表的尾节点。然后创造临时链表,使临时链表的值等于虚拟链表的头节点,利用临时链表依次遍历,之后的过程和一般思路是一样的。最后返回虚拟链表的尾节点就可以啦。
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* cur = dummy;
while (cur->next != NULL){
ListNode* tmp = cur->next;
if (cur->next->val == val){
cur->next = cur->next->next;
delete tmp;
}
else cur = cur->next;
}
return dummy->next;
}
};