今天来分享的是移除链表元素的题目。
题目描述如下。
那么本道题目操作的是单链表,需要注意的是,单链表只能顺序通过next访问数组中的元素。
实现方法1:不使用虚拟节点进行求解
不使用虚拟节点我们在处理头结点需要进行判断,如果要删除的元素是头结点,那么我们此时让head=head.next
;
如果删除的不是头结点,那么就让head.next=head.next.next
即可删除元素。
那么具体呢,我们来结合代码进行讲解下。
代码如下:
class Solution {
public ListNode removeElements(ListNode head, int val) {
while (head!=null&&head.val==val){
head=head.next;
}
//将头结点赋值给cur,操作的是cur不要直接操作head节点。
ListNode cur=head;
//特别说明,这里定义cur要指向的是head,而不是head.next
// 如果定义的cur=head.nextd的话,那么此时发现被删除的元素是head,这样就无法对head节点进行操作。
// 单链表是没有办法操作前一个元素
//循环结束条件是链表为空
while (cur!=null){
//如果删除的元素的值与目标值相同
while (cur.next!=null&&cur.next.val==val){
//将cur.next指向cur.next.next完成删除操作
cur.next=cur.next.next;
}
//如果没有找到目标元素,cur向后移动
cur=cur.next;
}
return head;
}
}
具体的需要注意的事项和点,我写在了上面的代码注释部分大家可以看着理解一下。
方法2:使用一个虚拟节点解题
在这里我们定义一个虚拟节点VirNode
,并让VirNode的next指向头节点head,这样就可以完成对头结点和其它节点一致的操作,而不需要像方法1一样要特别对head节点进行一个判断。
具体代码实现如下:
/**
* 使用虚拟节点
*/
//定义虚拟节点
ListNode VirNode = new ListNode();
//虚拟节点的next指向head结点
VirNode.next = head;
//定义节点指向VirNode不要操作VirNode
ListNode node = VirNode;
//循环中止条件是node.next为空
while (node.next != null) {
//如果找到要删除的元素, node.next指向node.next.next
if (node.next.val == target) {
node.next = node.next.next;
} else {
//没有找到要删除的元素,node向后移
node = node.next;
}
//这里需要注意的是不可以将node=node.next写在else判断外面,这样会导致
//找到和未找到删除的元素,node都会向后移动,这样就不是我们想要达到的效果
}
//最后返回的是VirNode.next,而不是head,因为head可能会被删除,这样就无法定位到head的位置
//而VirNode.next是我们指向的新的头结点。
return VirNode.next;
那么具体的代码和思路在我的上述代码中进行了一个i详细的描述如果大家觉得有问题可以在下方留言,博主看到会进行解答,觉得博主写的不错的麻烦给一个小小的?学习O(∩_∩)O!