删除链表中等于给定值val的所有节点
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
思路
不难,删除元素需要考虑三种情况:
- 头部删除
- 尾部删除
- 中间删除
可以设置一个空的节点virtual,让他指向头结点,这样删除头结点和删除中间节点就是一样的操作,不要额外考虑。最后返回时,返回virtual节点的下一个节点。
由于删除元素需要前一个元素,为了避免删除时再去依次遍历到前一个元素,用一个prve存放前一个元素可以提高效率。
public ListNode removeElements(ListNode head, int val) {
if(head == null){
return null;
}
ListNode virtual = new ListNode(-1);
virtual.next = head; //添加一个辅助头节点
ListNode prev = virtual;
while(head != null){
if(head.val == val){ //出现相等值
if(head.next == null){ //尾部删除
prev.next = null;
return virtual.next;
}else{ //中间删除
prev.next = head.next;
head = head.next;
}
}else{ //值不相等,prev、head依次顺移一位
prev = prev.next;
head = head.next;
}
}
return virtual.next; //返回辅助节点的下一个节点
}
2.递归
暂时不研究,看不懂。。。