题目描述
给你一个链表的头节点 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
输出:[]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-linked-list-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
该题是一个简单题,可以建立一个虚拟头节点或者叫做哑结点,这个虚拟节点的作用就是让原本的特殊的头节点普通化,利于我们的处理(就是原来的链表都当做普通的节点来处理就可以)
注意我们首先要声明,申请空间存放这个虚拟头结点
再来找一个指针p来遍历这个链表
然后判断后面的节点是否为空,如果为空就返回头结点,如果不为空就要进行进一步的判断,看其是否满足题设条件(是否等于val)
两种情况
满足条件(等于val),让p指针指向待删除节点的后一个节点,即p->next = p->next-next;
不满足条件,让p指针向后移动,即p=p->next;
核心代码实现
C语言
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val){
//因为要建立一个虚拟的头结点,因此必须申请空间
struct ListNode *H = (struct ListNode *)malloc(sizeof(struct ListNode));
H->next = head;
struct ListNode *p = H;
while(p->next!=NULL){
if(p->next->val == val){
p->next = p->next->next;
} else {
p = p->next;
}
}
//移动到最后一个节点,这里不能返回头结点,以为头结点可能被删了,所以返回虚拟头结点的next结点
return H->next;
}
Java(和C语言同样的思路)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode prev = new ListNode(-1);
prev.next = head;
ListNode p = prev;
while(p.next != null){
if(p.next.val == val){
p.next = p.next.next;
} else {
p = p.next;
}
}
return prev.next;
}
}