版权声明:转载请注明出处: https://blog.csdn.net/qq_34774655/article/details/85291459
运用的知识:链表 参考:自定义链表
题目描述:
删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
方式一:不用虚拟头结点(比较繁琐,需要单独对第一个节点进行判断。)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
//单独判断头结点
while(head != null && head.val == val){
ListNode delNode = head;
head = head.next;
delNode.next = null;
}
if(head==null){
return null;
}
//定义一个指针,用于找到要删除节点的前一个节点
ListNode prev=head;
while(prev.next!=null){
if(prev.next.val==val){
ListNode delNode=prev.next;
prev.next=delNode.next;
delNode.next=null;
}else{
prev=prev.next;
}
}
return head;
}
}
方式二:构造一个虚拟头结点(存的值为-1):
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode dummyHead=new ListNode(-1);
dummyHead.next=head;
ListNode prev=dummyHead;
while(prev.next!=null){
if(prev.next.val==val){
ListNode delNode=prev.next;
prev.next=delNode.next;
delNode.next=null;
}else{
prev=prev.next;
}
}
return dummyHead.next;
}
}
运用的知识:递归
扫描二维码关注公众号,回复:
4762573 查看本文章
方式一:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
//基本问题
if(head==null){
return null;
}
//更小的同一问题
ListNode result=removeElements(head.next,val);
if(head.val==val){
return result;
}else{
head.next=result;
return head;
}
}
}
对方式一的改进:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head==null){
return null;
}
head.next=removeElements(head.next,val);
return head.val==val ? head.next: head;
}
}