题目
移除链表元素
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点
示例:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
思路1
不引入虚拟头节点 (需要对头节点特殊处理)
public ListNode removeElements1(ListNode head, int val) {
if (head == null) return null;
ListNode prev = head;
while (prev.next != null){
if (prev.next.val == val){
prev.next = prev.next.next; //注意这个时候prev不需要后移
} else {
prev = prev.next;
}
}
//因为是从prev.next开始判断的,所以第一个节点没有判断到,需要特殊处理
if (head.val == val){
head = head.next;
}
return head;
}
思路2
引入虚拟头节点
public ListNode removeElements2(ListNode head, int val) {
ListNode host = new ListNode();//创建一个虚拟头节点
host.next = head;
ListNode pre = host;
while (pre.next != null){
if (pre.next.val == val){
pre.next = pre.next.next;
} else {
pre = pre.next;
}
}
return host.next;
}
思路3
引入一个新的结果链表,利用tail
指针尾插
public ListNode removeElements3(ListNode head, int val) {
ListNode host = new ListNode();//创建一个虚拟头节点
ListNode tail = host; //tail指针
ListNode p = head;
while (p != null){
ListNode temp = p.next;
if (p.val != val){
p.next = null;
tail.next = p;
tail = p;
}
p = temp.next;
}
return host.next;
}