移除链表元素
题:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1
输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7
输出:[]
思路
- 直接使用原来的链表来进行删除操作。
在单链表中移除头结点和移除其他节点的操作方式是不一样,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。其实在写代码的时候也会发现,需要单独写一段逻辑来处理移除头结点的情况。其余节点只要使指针指向下一节点就行了。注意C++编程要手动在内存中清除已经删除的节点,其余语言不需要
/**
* 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){//因为可能删除后第一个还是val,不用if
ListNode* tmp = head;
head = head->next;
delete tmp;//清理内存
}
//删除非头节点
ListNode* cur = head;
while (cur != NULL && cur->next != NULL){
if(cur->next->val == val) {
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
}else {
cur = cur->next;
}
}
return head;
}
所以头结点如何移除呢,其实只要将头结点向后移动一位就可以,这样就从链表中移除了一个头结点。
2. 设置一个虚拟头结点在进行删除操作。
可以设置一个虚拟头结点,这样原链表的所有节点就都可以按照统一的方式进行移除了。最后,return 头结点的时候,不要忘了 return dummyNode->next;, 这才是新的头结点
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
//设置虚拟头节点
ListNode* dummyhead = new ListNode(0);
dummyhead->next = head;
ListNode* cur = dummyhead;
while (cur->next != NULL) {
if (cur->next->val == val){
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
}else {
cur = cur->next;
}
}
head = dummyhead->next;
delete dummyhead;
return head;
}
};