移除链表的元素
给你一个链表的头节点
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 输出:[]
链表的删除包括两种情况
1、在原链表的基础上进行操作(两种情况)
1、删除头节点:头节点直接后移。
所以头结点如何移除呢,其实只要将头结点向后移动一位就可以,这样就从链表中移除了一个头结点。
依然别忘将原头结点从内存中删掉。
2、删除其余节点:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//采用虚拟节点的方式。注意需要再设置一个节点curr等于hhead用来循环
struct ListNode* removeElements(struct ListNode* head, int val) {
struct ListNode *temp;
//删除头节点
while(head&&head->val == val){
temp = head;
head = head -> next;
free(temp);
}
//删除非头节点
struct ListNode *curr = head;
while(curr&&(temp = curr->next)){
if(temp->val == val){
curr->next = temp->next;
free(temp);
}
else {
curr = curr->next;
}
}
return(head);
}
2、添加虚拟头节点进行操作(一种情况);
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//采用虚拟节点的方式。注意需要再设置一个节点curr等于hhead用来循环
struct ListNode* removeElements(struct ListNode* head, int val) {
typedef struct ListNode ListNode;
ListNode* hhead;
hhead = (ListNode*)malloc(sizeof(ListNode));
hhead->next = head;
ListNode*curr = hhead;//在下列循环中每次循环hhead在往后移动;如果不重新定义一个curr在后面的hhead->next != head;
while(curr->next!=NULL){
if(curr->next->val == val){
ListNode* temp = curr->next;
curr->next = curr->next->next;
free(temp);//释放节点;
}
else{
curr=curr->next;
}
}
head = hhead->next;
return(head);
}