[数据结构]移除单链表中特定元素---创建虚拟头节点法和不创建虚拟头节点法

移除单链表中特定元素

问题描述:

6->2->6->4->6 val=6

2->4

问题思路:

第一种解题方法:创建虚拟头节点,判断链表是否为空,若为空则直接返回null,若不为空,则遍历链表比较删除指定元素,返回头节点。

第二种解题方法:不创建虚拟头节点,需判断链表是否为空、考虑删除头节点、删除连续节点情况。

建议第一种方法,思路清晰,操作简便。

第一种方法源代码:

class ListNode {
     int val;
     ListNode next;
     ListNode(int x) {
         val = x;
     }
  }
class Solution {
    public static ListNode reverseList(ListNode head, int val) {
        ListNode dummyHead=new ListNode(-1);//创建虚拟头节点(作用为操作统一)
        dummyHead.next=head;//连接头节点
        if(head==null){
            return head;
        }else{
            for(ListNode temp=dummyHead;temp!=null;temp=temp.next){//遍历链表
                if(temp.next.val==val){//遍历链表从虚拟头节点开始,故temp.next为实际头节点
                    temp.next=temp.next.next;
                }else{
                    temp=temp.next;
                }
            }
        }
        return dummyHead.next;//返回实际头节点
    }
    public static void main(String[] args){
        ListNode listNode1=new ListNode(6);
        ListNode listNode2=new ListNode(2);
        ListNode listNode3=new ListNode(6);
        ListNode listNode4=new ListNode(4);
        ListNode listNode5=new ListNode(6);
        listNode1.next=listNode2;
        listNode2.next=listNode3;
        listNode3.next=listNode4;
        listNode4.next=listNode5;
        ListNode prev=reverseList(listNode1,6);
        for(ListNode temp=prev;temp!=null;temp=temp.next){
            System.out.print(temp.val+"->");
        }
    }
  }

核心算法详解:

在这里插入图片描述

执行结果:

!在这里插入图片描述

第二种方法源代码:

class ListNode {
     int val;
     ListNode next;
     ListNode(int x) {
         val = x;
     }
  }
class Solution {
    public static ListNode reverseList(ListNode head,int val) {
        if(head==null){//判断是否为空链表
            return null;
        }
        //6->6->1
        while(head!=null&&head.val==val){//判断是否头节点为指定元素
            head=head.next;
        }
        ListNode prev=head;
        //1->2->6->2
        while (prev.next!=null) {//头节点为非指定元素情况
            if (prev.next.val == val) {
                prev.next = prev.next.next;
            } else {
                prev = prev.next;
            }
        }
        return head;
    }
    public static void main(String[] args){
        ListNode listNode1=new ListNode(6);
        ListNode listNode2=new ListNode(2);
        ListNode listNode3=new ListNode(6);
        ListNode listNode4=new ListNode(4);
        ListNode listNode5=new ListNode(6);
        listNode1.next=listNode2;
        listNode2.next=listNode3;
        listNode3.next=listNode4;
        listNode4.next=listNode5;
        ListNode prev=reverseList(listNode1,6);
        for(ListNode temp=prev;temp!=null;temp=temp.next){
            System.out.print(temp.val+" ");
        }
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值