移除链表元素问题
给你一个链表的头节点head和一个整数val ,请你删除链表中所有满足Node.val == val的节点,并返回新的头节点 。
问题分析
一个很简单的链表删除操作,通过头结点不断向后面的结点移动,比较每一个结点是否等于val,是就执行链表的删除操作。
原链表直接解决问题
我们需要注意的是头结点的删除方式和其他结点的不同
- 删除头结点:head=head.next 直接让头结等于下一个节点
- 删除非头结点(A.next):A.next=A.next.next 该节点的上一个节点的指针域指向该节点的下一个节点
此问题为单链表,在java中的定义为
class ListNode {
int val; //节点元素
ListNode next; //节点指针域
//下面为节点的三种构造方式
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
具体代码
//直接解法
public ListNode removeElements1(ListNode head, int val) {
//删除头结点
while(head!=null&&head.val==val){
head=head.next;
}
ListNode pointer=head; //用于删除操作的指针
while(pointer!=null&&pointer.next!=null){
//如果结点值等于val删除这个结点
if(pointer.next.val==val){
pointer.next=pointer.next.next;
}
else {
pointer=pointer.next; //指针向下一个节点移动
}
}
//返回头结点
return head;
}
设置虚拟头结点解决问题
常规的操作手段需要我们将头结点与非头结点分开处理,那么在原本的头结点前增加一个节点,这样就不存在删除头结点的问题了,就可以去掉单独处理头结点的逻辑,最后返回增加头结点的下一个节点就是原链表的最终头节点了。
这个增加的头结点通常叫做虚拟头结点。
具体代码
//采用虚拟头结点
public ListNode removeElements(ListNode head, int val) {
ListNode dummyHead=new ListNode(0); //创建虚拟头结点
dummyHead.next=head; //虚拟头结点的指针指向头结点
ListNode pointer=dummyHead; //用于删除操作的指针
// 删除结点
while(pointer!=null&&pointer.next!=null){
//如果结点值等于val删除这个结点
if(pointer.next.val==val){
pointer.next=pointer.next.next;
}
else {
pointer=pointer.next; //指针向下一个节点移动
}
}
//返回实际头结点,虚拟头结点的下一个节点
return dummyHead.next;
}