系列文章目录
【LeetCode】力扣26.删除有序数组中的重复项(双指针)-CSDN博客
一、前言
思路清晰的题解分享:
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
二、题目203. 移除链表元素
给你一个链表的头节点 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 输出:[]
提示:
- 列表中的节点数目在范围
[0, 104]
内 1 <= Node.val <= 50
0 <= val <= 50
三、分析
删除链表元素,有2个方法:
1)采用原来的链表进行元素的删除
2)使用虚拟头节点进行删除
使用方法(1)
首先,了解单链表的删除元素操作!
一般情况,通过前一个结点来删除当前节点。
但是,头节点没有前一个结点!
因此,对于头节点应该特殊对待!!!
头节点处理方法:
将头结点向后移动一位就可以,这样就从链表中移除了一个头结点。
//头节点存在
//且 头节点的值 等于 val
struct ListNode* temp;
while(head != NULL && head->val == val){
temp = head;//储存头节点
head = head->next;//设置新的头节点为“head->next”
free(temp);//删除头节点
}
图解:
四、代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val) {
//头节点不存在
if(head == NULL){
return head;
}
//头节点存在
//且 头节点的值 等于 val
struct ListNode* temp;
while(head != NULL && head->val == val){
temp = head;//储存头节点
head = head->next;//设置新的头节点为“head->next”
free(temp);//删除头节点
}
//头节点存在 头节点的值 不等于 val
struct ListNode* cur = head;
while(cur != NULL && cur->next != NULL){
struct ListNode* back = cur->next;
if(back->val == val){//头节点已经处理过了,只需要处理之后的节点,的val
cur->next = back->next;
free(back);
}
else{
cur = cur->next;
}
}
return head;
}